home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 20 / 3 / DISK2032.ZIP / MPLUS.DOC < prev    next >
Text File  |  1990-09-01  |  151KB  |  6,667 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.                                 Start of MPLUS.DOC
  16.  
  17.                   This document is approximately 100 pages long.
  18.  
  19.  
  20.  
  21.  
  22.                     ******************************************
  23.                     HP LaserJet Owners: set form length to 66
  24.                     ******************************************
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.                    The  MPLUS(TM)  Graphic  Interface  Library
  83.  
  84.                                    Version 1.3
  85.                                 September 1, 1990
  86.  
  87.  
  88.                                  Reference  Guide
  89.                                    Disk Version
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.                                    Michael Yam
  97.                              230 East 88th St. Apt 6B
  98.                                 New York, NY 10128
  99.  
  100.                                   (212) 996-2582
  101.  
  102.                             Compuserve ID: 76367,3040
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.                         Copyright 1989, 1990  Michael Yam
  117.                                All Rights Reserved.
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.          COPYRIGHTS
  178.  
  179.          MPLUS Software Copyright 1989, 1990 by Michael Yam.  All rights
  180.          reserved.
  181.          This document Copyright 1989, 1990 by Michael Yam.  All rights
  182.          reserved.
  183.  
  184.  
  185.  
  186.          TRADEMARKS
  187.  
  188.          MPLUS (TM) is a trademark of Michael Yam.
  189.  
  190.          Other brand and product names are trademarks or registered
  191.          trademarks of their respective companies.
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.          MPLUS                                                    Contents
  202.  
  203.  
  204.  
  205.  
  206.  
  207.          CONTENTS
  208.          --------
  209.  
  210.  
  211.  
  212.                   Registration
  213.  
  214.  
  215.                   Introduction
  216.  
  217.  
  218.                   Chapter 1.    Getting Started
  219.  
  220.  
  221.                   Chapter 2.    Graphic Support
  222.  
  223.  
  224.                   Chapter 3.    Graphic Windows
  225.  
  226.  
  227.                   Chapter 4.    Graphic Dialogue
  228.  
  229.  
  230.                   Chapter 5.    Graphic Image
  231.  
  232.  
  233.                   Chapter 6.    Menu Bar
  234.  
  235.  
  236.                   Chapter 7.    Mouse Support
  237.  
  238.  
  239.                   Appendix A.   Function Index
  240.  
  241.  
  242.                   Appendix B.   Revision History
  243.  
  244.  
  245.                   Appendix C.   Library Incompatibilities
  246.  
  247.  
  248.                   Appendix D.   About Source Code
  249.  
  250.  
  251.                   Appendix E.   Shareware
  252.  
  253.  
  254.                   Appendix F.   Obtaining Support
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.          Copyright 1989, 1990 by Michael Yam
  262.  
  263.  
  264.  
  265.  
  266.  
  267.          MPLUS 1.3                                           Registration
  268.  
  269.  
  270.  
  271.  
  272.          REGISTRATION
  273.          ------------
  274.  
  275.  
  276.  
  277.          LICENSE
  278.  
  279.  
  280.          MPLUS is copyright (C) 1989, 1990 by Michael Yam.
  281.  
  282.          All versions of MPLUS are not free, nor are they public domain.
  283.          MPLUS is distributed as shareware -- a concept which brings
  284.          quality software to market at a modest price (see Appendix E).
  285.  
  286.          As a non-registered user, you may use the MPLUS small model
  287.          library for personal and non-commercial purposes.  To this
  288.          extent, no registration fee is required.
  289.  
  290.          You may distribute the small model library of MPLUS, and are
  291.          encouraged to do so but with the following limitations:
  292.  
  293.              No price or other consideration may be charged.
  294.              Distribution costs, however, may be charged for the cost of
  295.              the disk, and shipping and handling, as long as it does not
  296.              exceed twelve dollars ($12.00) total.
  297.  
  298.              The MPLUS library and on-disk documentation may not be
  299.              modified in any way and must be distributed together.
  300.  
  301.              MPLUS may not be distributed or sold as part of any other
  302.              product.
  303.  
  304.              The printed manual may not be copied or reproduced in any
  305.              way.
  306.  
  307.  
  308.          If your use of MPLUS goes beyond personal use, or should your
  309.          needs require the MPLUS medium, compact, or large model
  310.          libraries, or source code, you are required to register your
  311.          copy.
  312.  
  313.          Registration grants you a license to use the MPLUS library on a
  314.          regular basis and to distribute your programs created with the
  315.          MPLUS library.  This license is royalty-free.  This license is
  316.          also a single-user one; you may use MPLUS on any computer as
  317.          long as only one person uses it at a time.
  318.  
  319.          You may not distribute the medium, compact, and large models of
  320.          the MPLUS library.  The author reserves the exclusive right to
  321.          distribute these libraries.
  322.  
  323.                                            (continued on next page...)
  324.  
  325.  
  326.  
  327.          Copyright 1989, 1990 by Michael Yam                            1
  328.  
  329.  
  330.  
  331.  
  332.  
  333.          MPLUS 1.3                                           Registration
  334.  
  335.  
  336.          LICENSE (... continued from previous page)
  337.  
  338.  
  339.          Source code is available under the following terms:
  340.  
  341.              You may not distribute the source code.
  342.  
  343.              The copyright notices must remain in the source code.  It is
  344.              your responsibility to identify and document any changes you
  345.              make to the source code.
  346.  
  347.              You may modify the source code and/or incorporate it into
  348.              your programs provided your final product for distribution
  349.              is not of similar nature to MPLUS.
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357.  
  358.  
  359.  
  360.  
  361.  
  362.  
  363.  
  364.  
  365.  
  366.  
  367.  
  368.  
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.          DISCLAIMER OF WARRANTY
  378.  
  379.          THIS SOFTWARE AND MANUAL ARE SOLD "AS IS" AND WITHOUT WARRANTIES
  380.          AS TO PERFORMANCE OF MERCHANTABILITY OR ANY OTHER WARRANTIES
  381.          WHETHER EXPRESSED OR IMPLIED.  BECAUSE OF THE VARIOUS HARDWARE
  382.          AND SOFTWARE ENVIRONMENTS INTO WHICH THIS PROGRAM MAY BE PLACED,
  383.          NO WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE IS OFFERED.
  384.  
  385.          GOOD DATA PROCESSING PROCEDURE DICTATES THAT ANY PROGRAM BE
  386.          THOROUGHLY TESTED WITH NON-CRITICAL DATA BEFORE RELYING ON IT.
  387.          THE USER MUST ASSUME THE ENTIRE RISK OF USING THE PROGRAM.  ANY
  388.          LIABILITY OF THE SELLER WILL BE LIMITED EXCLUSIVELY TO PRODUCT
  389.          REPLACEMENT OR REFUND OF PURCHASE PRICE.
  390.  
  391.  
  392.  
  393.          Copyright 1989, 1990 by Michael Yam                            2
  394.  
  395.  
  396.  
  397.  
  398.  
  399.          MPLUS 1.3                                           Registration
  400.  
  401.  
  402.          ORDER INFORMATION
  403.  
  404.  
  405.          MPLUS is available in two flavors:
  406.  
  407.              1) Small model.  Documentation on disk.
  408.              2) Registered version (includes source code).
  409.  
  410.  
  411.          For personal, non-commercial use, the small model MPLUS library
  412.          is available for twelve dollars ($12.00).  This fee covers the
  413.          cost of materials, shipping, and handling.  You may also
  414.          download a copy from Compuserve.  MPLUS resides in the IBMPRO
  415.          forum under "C" (library 3).
  416.  
  417.          Registration costs fifty dollars ($50.00) per copy and provides
  418.          the following:
  419.  
  420.              -- All source code.
  421.              -- Small, medium, compact, and large model libraries.
  422.              -- Laser printed manual (Times Roman font).
  423.              -- Support via U.S. mail, Compuserve email, and voice mail.
  424.                 (see Appendix F.)
  425.              -- Upgrades at a discount.
  426.  
  427.  
  428.          A registered copy of MPLUS licenses you to use the product on a
  429.          regular basis and to distribute your programs created with the
  430.          MPLUS library.  The license is royalty-free and single-user.
  431.  
  432.          The success of any product depends on its customers'
  433.          satisfaction.  Comments, good and bad, are welcome.  Note: you
  434.          do not have to be a registered user to submit suggestions or
  435.          complaints.
  436.  
  437.          Please use the order form on the next page.
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.          Copyright 1989, 1990 by Michael Yam                            3
  460.  
  461.  
  462.  
  463.  
  464.  
  465.          MPLUS 1.3                                           Registration
  466.  
  467.  
  468.          ORDER FORM
  469.  
  470.          Send check to:
  471.  
  472.              Michael Yam
  473.              230 East 88th St.  Apt 6B
  474.              New York, NY 10128
  475.  
  476.  
  477.                             Quantity  Price Each     Total Price
  478.  
  479.          Small Model Only   _____     $12.00         $_________
  480.  
  481.          Registered Version
  482.          with Source code   _____     $50.00         $_________
  483.  
  484.          Orders outside the U.S.,
  485.          please add                    $5.00         $_________
  486.  
  487.                                            TOTAL:    $_________
  488.  
  489.  
  490.  
  491.          Disk Format (check one):  5 1/4" _____      3 1/2" _____
  492.  
  493.  
  494.          Ship To:
  495.  
  496.             Name: _________________________________________
  497.  
  498.          Company: _________________________________________
  499.  
  500.          Address: _________________________________________
  501.  
  502.                 : _________________________________________
  503.  
  504.             City: ____________________  State: _____   Zip: __________
  505.  
  506.          Country (if outside of U.S.): _______________________________
  507.  
  508.          Day Phone: _____________________  Compuserve id: ____________
  509.  
  510.  
  511.          Where did you hear about MPLUS? _____________________________
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.          Domestic orders shipped via U.S. Priority Mail.
  522.  
  523.  
  524.  
  525.          Copyright 1989, 1990 by Michael Yam                            4
  526.  
  527.  
  528.  
  529.  
  530.  
  531.          MPLUS                                               INTRODUCTION
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.          INTRODUCTION
  539.          ------------
  540.  
  541.  
  542.          MPLUS is a graphic interface library for Microsoft C.  If your
  543.          program includes business or scientific charts, fractal images,
  544.          or just sets one pixel, MPLUS may be of use.  By providing
  545.          menus, windows, dialogue boxes, and mouse support, MPLUS gets
  546.          your program up to speed quickly and easily.
  547.  
  548.  
  549.          Is MPLUS for you?  When designing your application...
  550.  
  551.          Remember your software's needs.  If your program deals only with
  552.          characters, a text based windowing system may be what you need.
  553.          If your program requires graphing, multi-tasking, dynamic data
  554.          exchange between applications, and a real time feed to a stock
  555.          quotation system, you may need Microsoft Windows or OS/2.  MPLUS
  556.          is best suited for single-tasking, graphical applications.
  557.  
  558.          Remember your audience.  Will your end-user have a fast 386
  559.          machine with 4 megabytes?  Or will your end-user own IBM's new
  560.          286 based PS/1 for home and school?  Requiring relatively little
  561.          memory, MPLUS will fit comfortably in both extremes.
  562.  
  563.          Remember your timetable.  If you have 5 or more years to develop
  564.          your project, then a long term outlook is necessary.  By then,
  565.          fast 386 machines with 4 megabytes should be commonplace and
  566.          OS/2, Unix, or Windows may be the proper choice for a platform.
  567.          Projects due out in less than 5 years may benefit from MPLUS.
  568.          The venerable 286-AT class machine with 640k is today's and
  569.          tomorrow's most popular machine.  And it won't disappear anytime
  570.          soon (I understand there are still 8088 PCs around).
  571.  
  572.          It's evident that the application's requirements, its audience,
  573.          and its timetable, are all critical in choosing an interface and
  574.          environment.  From a programmer's view, MPLUS' major strengths
  575.          are low memory requirements, a low learning curve, and an
  576.          uncluttered look.  These qualities make MPLUS effective for
  577.          prototyping as well as producing a finished product.  Clearly,
  578.          MPLUS' simplicity doesn't allow it to do as much as the "big
  579.          GUIs", and for some of you, that will be a drawback.  For
  580.          others, simplicity is a virtue.
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.          Copyright 1989, 1990 by Michael Yam                            i
  592.  
  593.  
  594.  
  595.  
  596.  
  597.          MPLUS                                               INTRODUCTION
  598.  
  599.  
  600.          Using the MPLUS library requires some familiarity with
  601.          Microsoft's GRAPHICS library.
  602.  
  603.          Chapter 1 describes the contents of the distribution diskette
  604.          and "getting started" with this package.  Also, read this
  605.          chapter for MSC 5.0 to 6.0 migration issues.
  606.  
  607.          Chapter 2 contains two functions which must supersede
  608.          Microsoft's versions: mpsetvideomode() and mpouttext().
  609.  
  610.          Chapter 3 introduces GWDW, a graphic window.  In GRAPHICS.LIB
  611.          text and graphic output were separated, the former displayable
  612.          only in text windows, the latter allowed only in graphic
  613.          viewports.  The graphic window is a hybrid of the two, where
  614.          both text and graphics can be presented.
  615.  
  616.          Chapter 4 discusses an extension to the graphic window: the
  617.          dialogue box.  It presents information on the screen, and at a
  618.          simple level, allows the user to interact with your program.
  619.  
  620.          Chapter 5 is about graphic images -- picking them up, sliding
  621.          them across the screen, and putting them down.  Also described
  622.          are two functions used for rubberbanding effects: xorpt() and
  623.          xorline().
  624.  
  625.          Chapter 6 describes the menu system.  It provides a bar menu and
  626.          up to 5 levels of submenus. Menu titles and program functions
  627.          are easily plugged in.
  628.  
  629.          Chapter 7 provides support for the Microsoft or compatible
  630.          mouse.  The routines here are not purely "C" interfaces to the
  631.          mouse interrupt, 33H.  You'll also find an event handler and a
  632.          function which retrieves input from both the mouse and the
  633.          keyboard.
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.          Copyright 1989, 1990 by Michael Yam                           ii
  658.  
  659.  
  660.  
  661.  
  662.  
  663.          MPLUS                                            GETTING STARTED
  664.  
  665.  
  666.  
  667.  
  668.  
  669.  
  670.          CHAPTER 1
  671.          ---------
  672.  
  673.  
  674.          SYSTEM REQUIREMENTS
  675.  
  676.              PS/2, PC/XT/AT or close compatible.
  677.              DOS 2.0 and up.
  678.              CGA, EGA, or VGA graphic display (EGA or VGA recommended).
  679.              Microsoft C version 5.0, 5.1, 6.0 (with GRAPHICS.LIB).
  680.              Microsoft or compatible mouse (optional).
  681.  
  682.  
  683.          ON DISK
  684.  
  685.          The distribution disk contains the following files:
  686.  
  687.  
  688.              MPLUS.DOC           MPLUS documentation.
  689.              README.DOC          Last minute changes.
  690.              MPDEMO.EXE          Demos MPLUS' latest features.
  691.  
  692.              SMPLUS.LIB          Small model  (medium, compact, and large
  693.                                  models provided upon registration).
  694.  
  695.              GPLUS.H             Header file for MPLUS graphics
  696.                                  functions.
  697.              GSCREEN.H           Some manifest constants for screen
  698.                                  attributes.
  699.              MOUSER.H            Header file for mouse support.
  700.              MPMENU.H            Header file for new menu system.
  701.  
  702.              GWDWDEMO.C          Opens three windows, plots sine and
  703.                                  cosine waves.
  704.              GDDEMO.C            Samples of various dialogue boxes.
  705.              MENUDEMO.C          Illustrates new menu system.
  706.  
  707.              MPORIGIN.C          For MSC 6.0 compatibility, add this to
  708.                                  the MPLUS library.
  709.  
  710.              BMDEMO.C            OBSOLETE: Old menu demo included just
  711.                                  for study.
  712.              BARMENU.H           OBSOLETE: Old menu header included just
  713.                                  for study.
  714.  
  715.  
  716.          Source code to the MPLUS library is available to registered
  717.          users and is discussed in Appendix D.
  718.  
  719.  
  720.  
  721.  
  722.  
  723.          Copyright 1989, 1990 by Michael Yam          Getting Started 1-1
  724.  
  725.  
  726.  
  727.  
  728.  
  729.          MPLUS                                            GETTING STARTED
  730.  
  731.  
  732.          USING MPLUS
  733.  
  734.          A suggested way of installing MPLUS is to copy the desired MPLUS
  735.          library into your Microsoft C library subdirectory \MSC\LIB and
  736.          the headers into Microsoft's \MSC\INCLUDE.
  737.  
  738.          Virtually every MPLUS function requires that you include
  739.          Microsoft's "graph.h" header file and it must be placed before
  740.          any of MPLUS' own header files.
  741.  
  742.          For example:
  743.  
  744.              #include <graph.h>       /* Microsoft's */
  745.              #include <gplus.h>       /* MPLUS' */
  746.  
  747.  
  748.          The application program should be linked with Microsoft's
  749.          GRAPHICS.LIB and with the correct memory model of the MPLUS
  750.          library.  If you have a mouse, remember to load the driver.  The
  751.          MPLUS mouse functions will check for the presence of a mouse and
  752.          use it if found.
  753.  
  754.          The example below builds the graphic window demo, GWDEMO.EXE, in
  755.          the large memory model.
  756.  
  757.              cl -AL gwddemo.c -link graphics lmplus
  758.  
  759.  
  760.          If you've built a combined Microsoft library, one that already
  761.          contains GRAPHICS.LIB, then just omit the "graphics"
  762.          specification from the command line.
  763.  
  764.          Note: There is no huge model library of MPLUS.  Huge model
  765.          programs may be linked with the large model MPLUS library.
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.          Copyright 1989, 1990 by Michael Yam          Getting Started 1-2
  790.  
  791.  
  792.  
  793.  
  794.  
  795.          MPLUS                                            GETTING STARTED
  796.  
  797.  
  798.          FROM MSC 5.x TO 6.0
  799.  
  800.          If you are using Microsoft C 6.0, you'll discover an unresolved
  801.          external when linking with the MPLUS library.  MSC 6.0 renamed a
  802.          couple of its functions, replacing 5.x's _getlogcoord() and
  803.          _setlogorg() with _getviewcoord() and _setvieworg(),
  804.          respectively.
  805.  
  806.          If you are a registered user, you have access to the MPLUS
  807.          source code and can rebuild the entire system using MSC 6.0.  A
  808.          make file for NMAKE is provided: MPLUS.NMK.  Refer to Appendix D
  809.          for more details.
  810.  
  811.          If you don't have access to source, or don't want to rebuild the
  812.          system, compile MPORIGIN.C (using MSC 6.0) in the model of your
  813.          choice and add it to the appropriate MPLUS library.  The example
  814.          below does this for the small memory model.
  815.  
  816.              cl -c -AS -Ox -Zl MPORIGIN.C
  817.              lib SMPLUS.LIB + MPORIGIN,;
  818.  
  819.  
  820.          Please note that while the MPORIGIN solution is quick and easy,
  821.          rebuilding the MPLUS system with MSC 6.0 yields optimal code.
  822.  
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.  
  840.  
  841.  
  842.  
  843.  
  844.  
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.          Copyright 1989, 1990 by Michael Yam          Getting Started 1-3
  856.  
  857.  
  858.  
  859.  
  860.  
  861.          MPLUS                                            GETTING STARTED
  862.  
  863.  
  864.          FUNCTION SUMMARY
  865.  
  866.              Routine             Purpose
  867.              ------------------------------------------------------------
  868.              dev_ready           Checks the keyboard and mouse for input.
  869.              gdclose()           Closes a dialogue box.
  870.              gdialog()           Opens a dialogue box.
  871.              gdprompt()          Solicits a response from the user.
  872.              gdwrite()           Outputs text to dialogue box.
  873.              ginrectangle()      Determines if point x,y lies in a
  874.                                  rectangle or not.
  875.              ginwindow()         Determines if point x,y lies in a
  876.                                  graphic window or not.
  877.              gpickup()           "Picks up" a rectangular object from the
  878.                                  screen.
  879.              gputdown()          "Puts down" a rectangular object to the
  880.                                  screen.
  881.              grootclose()        Closes the root window.
  882.              grootopen()         Opens the root window using graphic
  883.                                  coordinates.
  884.              groottopen()        Opens the root window using text
  885.                                  coordinates.
  886.              gwdwclose()         Closes a graphic window.
  887.              gwdwclr()           Clears a graphic window.
  888.              gwdwgetactv()       Gets the active graphic window.
  889.              gwdwgetorg()        Gets the logical origin of a graphic
  890.                                  window.
  891.              gwdwopen()          Opens a graphic window using graphic
  892.                                  coordinates.
  893.              gwdwsetactv()       Makes a graphic window active for
  894.                                  output.
  895.              gwdwsetorg()        Sets the logical origin of a graphic
  896.                                  window.
  897.              gwdwtopen()         Opens a graphic window using text
  898.                                  coordinates.
  899.              loghighlite()       Highlights an image specified by logical
  900.                                  coordinates.
  901.  
  902.  
  903.  
  904.  
  905.  
  906.  
  907.  
  908.  
  909.  
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.          Copyright 1989, 1990 by Michael Yam          Getting Started 1-4
  922.  
  923.  
  924.  
  925.  
  926.  
  927.          MPLUS                                            GETTING STARTED
  928.  
  929.  
  930.          FUNCTION SUMMARY (continued)
  931.  
  932.              Routine             Purpose
  933.              ------------------------------------------------------------
  934.              mb_close()          Closes the menu bar.
  935.              mb_open()           Initializes the menu bar and displays it
  936.                                  on screen.
  937.              mb_run()            Runs the menu bar.
  938.              mb_stdcolors()      Initializes menu system to default
  939.                                  colors (EGA & VGA).
  940.              mpgetimage()        Saves a rectangular screen image.
  941.              mpouttext()         Outputs text in specified foreground and
  942.                                  background colors.
  943.              mpputimage()        Restores a rectangular image to screen.
  944.              mpsetvideomode()    Sets the screen's video mode.
  945.              mpwordwrap()        Enables/Disables wordwrap when using
  946.                                  mpouttext().
  947.              ms_cursor()         Returns the status of the cursor -- on
  948.                                  or off.
  949.              ms_getposition()    Gets the cursor position and the status
  950.                                  of the mouse buttons.
  951.              ms_getpress()       Gets the number of times the specified
  952.                                  button was pressed.
  953.              ms_getrelease()     Gets the number of times the specified
  954.                                  button was released.
  955.              ms_hidecursor()     Hides the mouse cursor.
  956.              ms_poll()           Polls the mouse for input.
  957.              ms_ready()          Determines if the mouse has input.
  958.              ms_reset()          Resets the mouse driver.
  959.              ms_setevent()       Enables/Disables mouse event checking.
  960.              ms_setposition()    Positions the cursor at specified
  961.                                  coordinates.
  962.              ms_showcursor()     Displays the mouse cursor.
  963.              ms_window()         Defines the screen region where the
  964.                                  mouse may roam.
  965.              physhighlite()      Highlights an image specified by
  966.                                  physical coordinates.
  967.              xorline()           Draws a line using the XOR operator.
  968.              xorpt()             Draws a point using the XOR operator.
  969.  
  970.  
  971.  
  972.  
  973.  
  974.  
  975.  
  976.  
  977.  
  978.  
  979.  
  980.  
  981.  
  982.  
  983.  
  984.  
  985.  
  986.  
  987.          Copyright 1989, 1990 by Michael Yam          Getting Started 1-5
  988.  
  989.  
  990.  
  991.  
  992.  
  993.          MPLUS                                            GRAPHIC SUPPORT
  994.  
  995.  
  996.  
  997.  
  998.  
  999.  
  1000.  
  1001.          CHAPTER  2
  1002.          ----------
  1003.  
  1004.  
  1005.  
  1006.          GRAPHIC SUPPORT
  1007.  
  1008.          Two routines here are named after Microsoft's functions and are
  1009.          distiguished by an "mp" prefix instead of an underscore:
  1010.          mpouttext() and mpsetvideomode().  They behave similarly to the
  1011.          originals but have additional features.  While it is optional to
  1012.          use mpouttext() (although preferred), use of mpsetvideomode() is
  1013.          essential.  mpsetvideomode() maintains external variables which
  1014.          other MPLUS functions need to reference.  The programmer may
  1015.          also reference these variables by setting up the appropriate
  1016.          declarations (see function description).
  1017.  
  1018.          Pre-1.3 versions of MPLUS used the function names outtext() and
  1019.          setvideomode().  Programs using these names will still compile
  1020.          because of macros defined in "gplus.h", but it is recommended
  1021.          that you use the "mp" versions for future compatibility with
  1022.          MPLUS.
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043.  
  1044.  
  1045.  
  1046.  
  1047.  
  1048.  
  1049.  
  1050.  
  1051.  
  1052.  
  1053.          Copyright 1989, 1990 by Michael Yam         Graphic Support  2-1
  1054.  
  1055.  
  1056.  
  1057.  
  1058.  
  1059.          MPLUS                                            GRAPHIC SUPPORT
  1060.  
  1061.  
  1062.          FUNCTION SUMMARY
  1063.  
  1064.              Routine                 Purpose
  1065.              ----------------------------------------------------------
  1066.              mpouttext()             Outputs text with a specified
  1067.                                      foreground color on the specified
  1068.                                      background color.
  1069.              mpsetvideomode()        Sets the screen's video mode.
  1070.              mpwordwrap()            Enables/Disables word wrap when
  1071.                                      using mpouttext().
  1072.  
  1073.  
  1074.  
  1075.  
  1076.  
  1077.  
  1078.  
  1079.  
  1080.  
  1081.  
  1082.  
  1083.  
  1084.  
  1085.  
  1086.  
  1087.  
  1088.  
  1089.  
  1090.  
  1091.  
  1092.  
  1093.  
  1094.  
  1095.  
  1096.  
  1097.  
  1098.  
  1099.  
  1100.  
  1101.  
  1102.  
  1103.  
  1104.  
  1105.  
  1106.  
  1107.  
  1108.  
  1109.  
  1110.  
  1111.  
  1112.  
  1113.  
  1114.  
  1115.  
  1116.  
  1117.  
  1118.  
  1119.          Copyright 1989, 1990 by Michael Yam         Graphic Support  2-2
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.          MPLUS                                                  mpouttext
  1126.  
  1127.  
  1128.          SUMMARY
  1129.  
  1130.          #include <gplus.h>
  1131.          #include <gscreen.h>
  1132.  
  1133.          void mpouttext(msg,fg,bg);
  1134.          char *text;                  null terminated string
  1135.          short fg;                    color of output text
  1136.          short bg;                    color of background
  1137.  
  1138.  
  1139.          DESCRIPTION
  1140.  
  1141.          The mpouttext() function outputs text in graphics mode with the
  1142.          color specified by "fg" and on a background specified by "bg".
  1143.          When writing to a graphic window (see chapter 3), set "bg" to -1
  1144.          if you want to use that window's background color.  Use of -1
  1145.          results in faster text output.
  1146.  
  1147.          Manifest constants for 16 colors in EGA and VGA modes are
  1148.          available in the gscreen.h.  The constants are not valid for
  1149.          _MRES256COLOR mode.
  1150.  
  1151.          When printing to a window established by gwdwtopen() or by
  1152.          gwdwopen(), output moves left to right and top to bottom.  Text
  1153.          will scroll automatically and will wordwrap if enabled with
  1154.          mpwordwrap().
  1155.  
  1156.          mpouttext() can write only to the current visual page whereas
  1157.          Microsoft's _outtext() writes to the active page, whether it is
  1158.          visual or not.
  1159.  
  1160.  
  1161.          RETURN VALUE
  1162.  
  1163.          None.
  1164.  
  1165.  
  1166.  
  1167.  
  1168.  
  1169.  
  1170.  
  1171.  
  1172.  
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.          Copyright 1989, 1990 by Michael Yam         Graphic Support  2-3
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.          MPLUS                                                  mpouttext
  1192.  
  1193.  
  1194.          EXAMPLE
  1195.  
  1196.          This example outputs text in various foreground and background
  1197.          colors.  Wordwrap and scrolling is also demonstrated.
  1198.  
  1199.          #include <graph.h>
  1200.  
  1201.          #include <gplus.h>
  1202.          #include <gscreen.h>
  1203.  
  1204.          main()
  1205.          {
  1206.              char buffer[51];
  1207.              int i;
  1208.              GWDW *gwptr;
  1209.  
  1210.              mpsetvideomode( _ERESCOLOR );
  1211.              gwptr = gwdwtopen( 5, 10, 15, 60,
  1212.                                 _GBORDER, BRIGHTWHITE, BLUE );
  1213.              mpouttext( "This appears in BRIGHTWHITE on BLUE.\n",
  1214.                          BRIGHTWHITE, BLUE );
  1215.              mpouttext( "So does this.  But this is faster.\n",
  1216.                          BRIGHTWHITE, -1 );
  1217.              mpouttext( "Here's BRIGHTWHITE on GREEN.\n",
  1218.                          BRIGHTWHITE, GREEN );
  1219.              mpouttext( "BLACK on CYAN gives good contrast.\n",
  1220.                          BLACK, CYAN );
  1221.  
  1222.              mpouttext( "\nWordwrap is off...", BRIGHTWHITE, -1 );
  1223.              getch();
  1224.              for( i=0; i<10; ++i )
  1225.              {
  1226.                   sprintf( buffer, "The quick brown fox jumped over the
  1227.                                     lazy dog. ");
  1228.                   mpouttext( buffer, LIGHTYELLOW, -1);
  1229.              }
  1230.  
  1231.              mpwordwrap(1);
  1232.              mpouttext( "\nWordwrap is on...", BRIGHTWHITE, -1 );
  1233.              getch();
  1234.              for( i=0; i<10; ++i )
  1235.              {
  1236.                   sprintf( buffer, "The quick brown fox jumped over the
  1237.                                     lazy dog. ");
  1238.                   mpouttext( buffer, LIGHTYELLOW, -1);
  1239.              }
  1240.              sprintf( buffer, "\nPress a key...");
  1241.              mpouttext( buffer, LIGHTRED, -1 );
  1242.              getch();
  1243.              gwdwclose( gwptr );
  1244.              mpsetvideomode( _DEFAULTMODE );
  1245.          }
  1246.  
  1247.  
  1248.  
  1249.  
  1250.  
  1251.          Copyright 1989, 1990 by Michael Yam         Graphic Support  2-4
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.          MPLUS                                             mpsetvideomode
  1258.  
  1259.  
  1260.          SUMMARY
  1261.  
  1262.          #include <graph.h>
  1263.          #include <gplus.h>
  1264.  
  1265.          int mpsetvideomode(mode);
  1266.          short mode;                  video mode
  1267.  
  1268.  
  1269.          DESCRIPTION
  1270.  
  1271.          This function operates just like Microsoft's _setvideomode()
  1272.          but stores the video configuration in an external structure for
  1273.          other MPLUS functions to reference.  The application program can
  1274.          reference the structure with the following declaration:
  1275.  
  1276.              extern  struct  videoconfig  _videoconfig;
  1277.  
  1278.  
  1279.          The videoconfig structure is supplied by Microsoft and detailed
  1280.          in "graph.h".  While it is possible to retrieve the video
  1281.          environment with Microsoft's _getvideoconfig(), referencing an
  1282.          external structure has the advantage of greater speed and less
  1283.          overhead.
  1284.  
  1285.          One other difference between mpsetvideomode() and
  1286.          _setvideomode() is that mpsetvideomode() removes any defined
  1287.          viewport or text window, whereas _setvideomode() does not.
  1288.  
  1289.          The manifest constants defining proper video modes are defined
  1290.          in Microsoft's "graph.h."  The table below summarizes them:
  1291.  
  1292.              Constant       Meaning
  1293.              ----------------------------------------------------------
  1294.              _DEFAULTMODE   Hardware default mode.
  1295.              _TEXTBW40      CGA Black & White, 40 column text mode.
  1296.              _TEXTC40       CGA Color, 40 column text mode.
  1297.              _TEXTBW80      CGA Black & White, 80 column text mode.
  1298.              _TEXTC80       CGA Color, 80 column text mode.
  1299.              _MRES4COLOR    CGA 4 Color, 320x200 pixels.
  1300.              _MRESNOCOLOR   CGA Black & White, 320x200 pixels.
  1301.              _HRESBW        CGA Black & White, 640x200 pixels.
  1302.              _TEXTMONO      Monochrome, 80 column text.
  1303.              _MRES16COLOR   EGA 16 color, 320x200 pixels.
  1304.              _HRES16COLOR   EGA 16 color, 640x200 pixels.
  1305.              _ERESNOCOLOR   EGA monochrome text.
  1306.              _ERESCOLOR     EGA 64 color, 640x350 pixels.
  1307.              _VRES2COLOR    VGA 2 color, 640x480 pixels.
  1308.              _VRES16COLOR   VGA 16 color, 640x480 pixels.
  1309.              _MRES256COLOR  VGA 256 color, 320x200 pixels.
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.          Copyright 1989, 1990 by Michael Yam         Graphic Support  2-5
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.          MPLUS                                             mpsetvideomode
  1324.  
  1325.  
  1326.          The following additional modes are supported in Microsoft C 6.0:
  1327.  
  1328.              Constant       Meaning
  1329.              ----------------------------------------------------------
  1330.              _MAXRESMODE    Graphics mode with highest resolution.
  1331.              _MAXCOLORMODE  Graphics mode with most colors.
  1332.              _HERCMONO      Hercules 2 color, 720x348 pixels.
  1333.              _ORESCOLOR     Olivetti 1 of 16 colors, 640x400.
  1334.  
  1335.  
  1336.  
  1337.          RETURN VALUE
  1338.  
  1339.          This function returns a nonzero int if successful, a 0 on
  1340.          failure.
  1341.  
  1342.  
  1343.          EXAMPLE
  1344.  
  1345.          This example illustrates access to MPLUS' external structure.
  1346.  
  1347.          #include <graph.h>
  1348.          #include <gplus.h>
  1349.  
  1350.          extern struct videoconfig _videoconfig;
  1351.  
  1352.          main()
  1353.          {
  1354.              mpsetvideomode( _DEFAULTMODE );
  1355.  
  1356.              /*      reference a structure element
  1357.               */
  1358.              printf("video memory = %d KB", _videoconfig.memory);
  1359.          }
  1360.  
  1361.  
  1362.  
  1363.  
  1364.  
  1365.  
  1366.  
  1367.  
  1368.  
  1369.  
  1370.  
  1371.  
  1372.  
  1373.  
  1374.  
  1375.  
  1376.  
  1377.  
  1378.  
  1379.  
  1380.  
  1381.  
  1382.  
  1383.          Copyright 1989, 1990 by Michael Yam         Graphic Support  2-6
  1384.  
  1385.  
  1386.  
  1387.  
  1388.  
  1389.          MPLUS                                                 mpwordwrap
  1390.  
  1391.  
  1392.          SUMMARY
  1393.  
  1394.          #include <graph.h>
  1395.          #include <gplus.h>
  1396.  
  1397.          int mpwordwrap(flag);
  1398.          char flag;                   wrap flag (0, 1, or 2)
  1399.  
  1400.  
  1401.          DESCRIPTION
  1402.  
  1403.          This function is used to enable or disable wordwrap when using
  1404.          mpouttext().  Normally, when text is being displayed to a
  1405.          graphic window, characters going beyond the right margin will
  1406.          wrap around and appear at the left margin on the next line.
  1407.          Enabling wordwrap will prevent a word from being split between
  1408.          margins; if there's no room on the line to display the entire
  1409.          word, the word will appear on the next line.
  1410.  
  1411.          A word is considered to be anything separated by spaces.
  1412.  
  1413.              flag           Meaning
  1414.              ----------------------------------------------------------
  1415.              0              wordwrap off (default)
  1416.              1              wordwrap on
  1417.              2              return status of wordwrap
  1418.  
  1419.  
  1420.          RETURN VALUE
  1421.  
  1422.          This function returns the previous setting of wordwrap.
  1423.  
  1424.  
  1425.          EXAMPLE
  1426.  
  1427.          See mpouttext().
  1428.  
  1429.  
  1430.  
  1431.  
  1432.  
  1433.  
  1434.  
  1435.  
  1436.  
  1437.  
  1438.  
  1439.  
  1440.  
  1441.  
  1442.  
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.          Copyright 1989, 1990 by Michael Yam         Graphic Support  2-7
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455.          MPLUS                                            GRAPHIC WINDOWS
  1456.  
  1457.  
  1458.  
  1459.  
  1460.  
  1461.  
  1462.          CHAPTER  3
  1463.          ----------
  1464.  
  1465.  
  1466.  
  1467.          GRAPHIC  WINDOWS
  1468.  
  1469.          In GRAPHICS.LIB text output could only appear in a "text window"
  1470.          while graphic output was restricted to the "graphic viewport."
  1471.          The MPLUS graphic window, also known as GWDW, is a hybrid object
  1472.          which can present both text and graphic output.  In addition a
  1473.          graphic window may be opened and closed, respectively saving and
  1474.          restoring the background area.
  1475.  
  1476.          The graphic window is achieved by overlaying a text window with
  1477.          a graphic viewport.  Note that a text window, being character
  1478.          oriented, must be byte aligned, whereas a graphic viewport can
  1479.          be pixel aligned.  Since precise overlaying is not always
  1480.          possible, the text window is always placed "inside" the graphic
  1481.          viewport.
  1482.  
  1483.          A graphic window is typically positioned and opened by
  1484.          specifying pixel coordinates (x,y); gwdwopen() performs this
  1485.          task.  Sometimes it may be more convenient to think and program
  1486.          in terms of text coordinates -- rows and columns -- especially
  1487.          when opening a window primarily to display text.  Use
  1488.          gwdwtopen() for those occasions; it accepts text coordinates.
  1489.          Regardless of the way a graphic window is opened, a GWDW will
  1490.          accept both text and graphic output.
  1491.  
  1492.          The number of graphic windows which can be opened at once
  1493.          depends upon available memory.  Graphic windows may overlap, but
  1494.          the programmer should not write to the one underneath.  Output,
  1495.          text or graphic, won't be clipped properly and will overwrite
  1496.          the contents of the upper window.  Problems also occur when
  1497.          closing the lower graphic window prior to closing the upper one:
  1498.          the lower one's background will be restored over the upper
  1499.          graphic window.  The management of overlapping windows may be
  1500.          avoided if graphic windows are arranged as tiles.
  1501.  
  1502.          There is one special form of graphic window known as the root
  1503.          window.  This root window behaves similarly to the standard
  1504.          graphic window, the difference being that it conserves memory by
  1505.          not saving the background area.  In effect the root window
  1506.          serves as the background screen.  Consequently, there should be
  1507.          only one root window in any given program and it must be opened
  1508.          before any graphic window is opened and closed after all graphic
  1509.          windows are closed.  Use of the root window is optional.  For
  1510.          more details, refer to the function descriptions of grootopen(),
  1511.          groottopen(), and grootclose().
  1512.  
  1513.  
  1514.  
  1515.          Copyright 1989, 1990 by Michael Yam         Graphic Windows  3-1
  1516.  
  1517.  
  1518.  
  1519.  
  1520.  
  1521.          MPLUS                                            GRAPHIC WINDOWS
  1522.  
  1523.  
  1524.          No matter how a graphic window is opened -- whether with
  1525.          gwdwopen(), gwdwtopen(), grootopen(), or groottopen() -- you
  1526.          have the option of giving it one of four basic appearances: with
  1527.          a border, without a border, raised, or sunken.  While all four
  1528.          looks are fine for displaying information, the last two, because
  1529.          of their depth, are particularly useful for simulating push
  1530.          buttons.
  1531.  
  1532.          The graphic window's appearance is governed by three arguments:
  1533.  
  1534.              "border"       border type.
  1535.              "fg"           foreground & border color.
  1536.              "bg"           background or "fill" color.
  1537.  
  1538.  
  1539.              "border" Constant        Action
  1540.              ----------------------------------------------------------
  1541.              _GFILLINTERIOR           The graphic window is opened
  1542.                                       without a border.  The interior is
  1543.                                       filled with the color specified in
  1544.                                       "bg."
  1545.  
  1546.              _GBORDER                 The graphic window is opened with a
  1547.                                       border.  The border is displayed
  1548.                                       with the color specified in "fg"
  1549.                                       and the interior is filled with the
  1550.                                       color specified in "bg."
  1551.  
  1552.              _GRAISE                  The graphic window opened appears
  1553.                                       raised.  The borders along the left
  1554.                                       and top sides are WHITE, and the
  1555.                                       borders along the right and bottom
  1556.                                       sides are BLACK.  The interior is
  1557.                                       filled with the color specified in
  1558.                                       "bg."
  1559.  
  1560.              _GSINK                   The graphic window opened appears
  1561.                                       sunken.  The borders along the left
  1562.                                       and top sides are BLACK, and the
  1563.                                       borders along the right and bottom
  1564.                                       side are WHITE.  The interior is
  1565.                                       filled with the color specified in
  1566.                                       "bg."
  1567.  
  1568.  
  1569.          Concerning _GRAISE and _GSINK, if you specify the background
  1570.          color as WHITE or BLACK, the border colors automatically change
  1571.          to BRIGHTWHITE and GREY to ensure contrast.  Recommended
  1572.          background colors are GREY, WHITE, or BLUE.  Bright colors tend
  1573.          to wash out the 3-D effect.
  1574.  
  1575.  
  1576.  
  1577.  
  1578.  
  1579.  
  1580.  
  1581.          Copyright 1989, 1990 by Michael Yam         Graphic Windows  3-2
  1582.  
  1583.  
  1584.  
  1585.  
  1586.  
  1587.          MPLUS                                            GRAPHIC WINDOWS
  1588.  
  1589.  
  1590.          A demo program and its source resides on the distribution disk
  1591.          as GWDWDEMO.EXE and GWDWDEMO.C, respectively.  It opens three
  1592.          windows, plots a sine and cosine wave, and finally closes all
  1593.          windows and exits.
  1594.  
  1595.          For an example of using a raised graphic window as a push
  1596.          button, see chapter 7, ginwindow().
  1597.  
  1598.  
  1599.          FUNCTION  SUMMARY
  1600.  
  1601.              Routine                  Purpose
  1602.              -----------------------------------------------------------
  1603.              grootclose()             Closes the root window.
  1604.              grootopen()              Opens the root window using graphic
  1605.                                       coordinates.
  1606.              groottopen()             Opens the root window using text
  1607.                                       coordinates.
  1608.              gwdwclose()              Closes a graphic window.
  1609.              gwdwclr()                Clears the graphic window.
  1610.              gwdwgetactv()            Gets the active graphic window.
  1611.              gwdwgetorg()             Gets the logical origin of a
  1612.                                       graphic window.
  1613.              gwdwopen()               Opens a graphic window using
  1614.                                       graphic coordinates.
  1615.              gwdwsetactv()            Makes a graphic window active.
  1616.              gwdwsetorg()             Sets the logical origin of a
  1617.                                       graphic window.
  1618.              gwdwtopen()              Opens a graphic window using text
  1619.                                       coordinates.
  1620.  
  1621.  
  1622.  
  1623.  
  1624.  
  1625.  
  1626.  
  1627.  
  1628.  
  1629.  
  1630.  
  1631.  
  1632.  
  1633.  
  1634.  
  1635.  
  1636.  
  1637.  
  1638.  
  1639.  
  1640.  
  1641.  
  1642.  
  1643.  
  1644.  
  1645.  
  1646.  
  1647.          Copyright 1989, 1990 by Michael Yam         Graphic Windows  3-3
  1648.  
  1649.  
  1650.  
  1651.  
  1652.  
  1653.          MPLUS                                                 grootclose
  1654.  
  1655.  
  1656.          SUMMARY
  1657.  
  1658.          #include <graph.h>
  1659.          #include <gplus.h>
  1660.  
  1661.          int grootclose(gwptr);
  1662.          GWDW *gwptr;                 graphic window pointer
  1663.  
  1664.  
  1665.          DESCRIPTION
  1666.  
  1667.          The function grootclose() closes the root window.  Windows
  1668.          opened with the gwdwopen() or gwdwtopen() functions should be
  1669.          closed before closing the root window.
  1670.  
  1671.  
  1672.          RETURN VALUE
  1673.  
  1674.          This function returns a 0 if the root window is successfully
  1675.          closed, a -1 on failure.
  1676.  
  1677.  
  1678.  
  1679.  
  1680.  
  1681.  
  1682.  
  1683.  
  1684.  
  1685.  
  1686.  
  1687.  
  1688.  
  1689.  
  1690.  
  1691.  
  1692.  
  1693.  
  1694.  
  1695.  
  1696.  
  1697.  
  1698.  
  1699.  
  1700.  
  1701.  
  1702.  
  1703.  
  1704.  
  1705.  
  1706.  
  1707.  
  1708.  
  1709.  
  1710.  
  1711.  
  1712.  
  1713.          Copyright 1989, 1990 by Michael Yam         Graphic Windows  3-4
  1714.  
  1715.  
  1716.  
  1717.  
  1718.  
  1719.          MPLUS                                                  grootopen
  1720.  
  1721.  
  1722.          SUMMARY
  1723.  
  1724.          #include <graph.h>
  1725.          #include <gscreen.h>
  1726.          #include <gplus.h>
  1727.  
  1728.          GWDW *grootopen(x1,y1,x2,y2,border,fg,bg);
  1729.          short x1,y1;                 upper left corner of window
  1730.          short x2,y2;                 lower right corner of window
  1731.          short border;                border flag
  1732.          short fg;                    window's foreground (and border) color.
  1733.          short bg;                    window's background color.
  1734.  
  1735.  
  1736.          DESCRIPTION
  1737.  
  1738.          The function grootopen() opens a root window using graphic
  1739.          coordinates.  A root window is special form of window; to save
  1740.          on memory requirements, it does not save the screen's
  1741.          background.  There should be only one root window in a given
  1742.          application and the root window should be opened prior to
  1743.          opening any other window via gwdwopen() or gwdwtopen().
  1744.  
  1745.          For graphic output, the upper left corner assumes logical origin
  1746.          (0,0), with x increasing from left to right, and y increasing
  1747.          from top to bottom. For text output, the upper left corner takes
  1748.          on the text coordinate of (1,1), with rows increasing from top
  1749.          to bottom, and columns increasing from left to right.  Text
  1750.          issued with outtext() moves from left to right with automatic
  1751.          wrap, and top to bottom with automatic text scrolling.
  1752.  
  1753.          The argument "border" may be one of four manifest constants:
  1754.  
  1755.              Constant                 Action
  1756.              ----------------------------------------------------------
  1757.              _GFILLINTERIOR           The graphic window is opened
  1758.                                       without a border.
  1759.              _GBORDER                 The graphic window is opened with a
  1760.                                       border.
  1761.              _GRAISE                  The graphic window appears raised.
  1762.              _GSINK                   The graphic window appears sunken.
  1763.  
  1764.  
  1765.          For more details concerning the border, refer to the chapter
  1766.          preface.
  1767.  
  1768.          Manifest constants for graphic EGA/VGA foreground and background
  1769.          colors are available in gscreen.h.
  1770.  
  1771.  
  1772.          RETURN VALUE
  1773.  
  1774.          This functions returns a GWDW pointer to the root window.  A
  1775.          NULL is returned if the root window could not be opened.
  1776.  
  1777.  
  1778.  
  1779.          Copyright 1989, 1990 by Michael Yam         Graphic Windows  3-5
  1780.  
  1781.  
  1782.  
  1783.  
  1784.  
  1785.          MPLUS                                                 groottopen
  1786.  
  1787.  
  1788.          SUMMARY
  1789.  
  1790.          #include <graph.h>
  1791.          #include <gscreen.h>
  1792.          #include <gplus.h>
  1793.  
  1794.          GWDW *groottopen(r1,c1,r2,c2,border,fg,bg);
  1795.          short r1,c1;                 upper left corner of window
  1796.          short r2,c2;                 lower right corner of window
  1797.          short border;                border flag
  1798.          short fg;                    window's foreground (and border) color.
  1799.          short bg;                    window's background color.
  1800.  
  1801.  
  1802.          DESCRIPTION
  1803.  
  1804.          The function groottopen() opens a root window using text
  1805.          coordinates.  A root window is special form of window; to save
  1806.          on memory requirements, it does not save the screen's
  1807.          background.  There should be only one root window in a given
  1808.          application and the root window should be opened prior to
  1809.          opening any other window via the gwdwopen() or gwdwtopen().
  1810.  
  1811.          For graphic output, the upper left corner assumes logical origin
  1812.          (0,0), with x increasing from left to right, and y increasing
  1813.          from top to bottom.  For text output, the upper left corner
  1814.          takes on the text coordinate of (1,1), with rows increasing from
  1815.          top to bottom, and columns increasing from left to right.  Text
  1816.          issued with outtext() moves from left to right with automatic
  1817.          wrap, and top to bottom with automatic text scrolling.
  1818.  
  1819.          The argument "border" may be one of four manifest constants:
  1820.  
  1821.              Constant                 Action
  1822.              ----------------------------------------------------------
  1823.              _GFILLINTERIOR           The graphic window is opened
  1824.                                       without a border.
  1825.              _GBORDER                 The graphic window is opened with a
  1826.                                       border.
  1827.              _GRAISE                  The graphic window appears raised.
  1828.              _GSINK                   The graphic window appears sunken.
  1829.  
  1830.  
  1831.          For more details concerning the border, refer to the chapter
  1832.          preface.
  1833.  
  1834.          Manifest constants for graphic EGA/VGA foreground and background
  1835.          colors are available in gscreen.h.
  1836.  
  1837.  
  1838.          RETURN VALUE
  1839.  
  1840.          This functions returns a GWDW pointer to the root window.  A
  1841.          NULL is returned if the root window could not be opened.
  1842.  
  1843.  
  1844.  
  1845.          Copyright 1989, 1990 by Michael Yam         Graphic Windows  3-6
  1846.  
  1847.  
  1848.  
  1849.  
  1850.  
  1851.          MPLUS                                                  gwdwclose
  1852.  
  1853.  
  1854.          SUMMARY
  1855.  
  1856.          #include <graph.h>
  1857.          #include <gplus.h>
  1858.  
  1859.          int gwdwclose(gwptr);
  1860.          GWDW *gwptr;                 graphic window pointer
  1861.  
  1862.  
  1863.          DESCRIPTION
  1864.  
  1865.          The function gwdwclose() closes a window opened by the
  1866.          gwdwopen() or gwdwtopen() function and restores the screen's
  1867.          background.  The window may be active or inactive.  If an active
  1868.          window is closed, this function makes no assumptions about the
  1869.          next active window.  Target windows for output are undefined
  1870.          until the programmer specifies the next active window with the
  1871.          gwdwsetactv() function.
  1872.  
  1873.  
  1874.          RETURN VALUE
  1875.  
  1876.          This function returns a 0 if the window is successfully closed,
  1877.          a -1 on failure.
  1878.  
  1879.  
  1880.  
  1881.  
  1882.  
  1883.  
  1884.  
  1885.  
  1886.  
  1887.  
  1888.  
  1889.  
  1890.  
  1891.  
  1892.  
  1893.  
  1894.  
  1895.  
  1896.  
  1897.  
  1898.  
  1899.  
  1900.  
  1901.  
  1902.  
  1903.  
  1904.  
  1905.  
  1906.  
  1907.  
  1908.  
  1909.  
  1910.  
  1911.          Copyright 1989, 1990 by Michael Yam         Graphic Windows  3-7
  1912.  
  1913.  
  1914.  
  1915.  
  1916.  
  1917.          MPLUS                                                    gwdwclr
  1918.  
  1919.  
  1920.          SUMMARY
  1921.  
  1922.          #include <graph.h>
  1923.          #include <gplus.h>
  1924.  
  1925.          gwdwclr(gwptr);
  1926.          GWDW *gwptr;                 graphic window pointer
  1927.  
  1928.  
  1929.          DESCRIPTION
  1930.  
  1931.          The function gwdwclr() clears the window specified by "gwptr"
  1932.          using the window's background attribute.
  1933.  
  1934.          For text output, the upper left corner takes on the text
  1935.          coordinate of (1,1), with rows increasing from top to bottom,
  1936.          and columns increasing from left to right.  For graphic output,
  1937.          any logical origin in effect (set by the gwdwsetorg() function)
  1938.          is cleared.  The upper left corner assumes logical origin (0,0),
  1939.          with x increasing from left to right, and y increasing from top
  1940.          to bottom.
  1941.  
  1942.  
  1943.          RETURN VALUE
  1944.  
  1945.          None.
  1946.  
  1947.  
  1948.  
  1949.  
  1950.  
  1951.  
  1952.  
  1953.  
  1954.  
  1955.  
  1956.  
  1957.  
  1958.  
  1959.  
  1960.  
  1961.  
  1962.  
  1963.  
  1964.  
  1965.  
  1966.  
  1967.  
  1968.  
  1969.  
  1970.  
  1971.  
  1972.  
  1973.  
  1974.  
  1975.  
  1976.  
  1977.          Copyright 1989, 1990 by Michael Yam         Graphic Windows  3-8
  1978.  
  1979.  
  1980.  
  1981.  
  1982.  
  1983.          MPLUS                                                gwdwgetactv
  1984.  
  1985.  
  1986.          SUMMARY
  1987.  
  1988.          #include <graph.h>
  1989.          #include <gplus.h>
  1990.  
  1991.          GWDW *gwdwgetactv(void);
  1992.  
  1993.  
  1994.          DESCRIPTION
  1995.  
  1996.          While several windows may be opened at once, only one can be
  1997.          active for output at any given moment.  The gwdwgetactv()
  1998.          function will get the active, or current, window.
  1999.  
  2000.  
  2001.          RETURN VALUE
  2002.  
  2003.          This function returns a GWDW pointer to the current window.  If
  2004.          no windows are opened, a NULL is returned.
  2005.  
  2006.  
  2007.  
  2008.  
  2009.  
  2010.  
  2011.  
  2012.  
  2013.  
  2014.  
  2015.  
  2016.  
  2017.  
  2018.  
  2019.  
  2020.  
  2021.  
  2022.  
  2023.  
  2024.  
  2025.  
  2026.  
  2027.  
  2028.  
  2029.  
  2030.  
  2031.  
  2032.  
  2033.  
  2034.  
  2035.  
  2036.  
  2037.  
  2038.  
  2039.  
  2040.  
  2041.  
  2042.  
  2043.          Copyright 1989, 1990 by Michael Yam         Graphic Windows  3-9
  2044.  
  2045.  
  2046.  
  2047.  
  2048.  
  2049.          MPLUS                                                 gwdwgetorg
  2050.  
  2051.  
  2052.          SUMMARY
  2053.  
  2054.          #include <graph.h>
  2055.          #include <gplus.h>
  2056.  
  2057.          void gwdwgetorg(gwptr,x0,y0);
  2058.          GWDW *gwptr;                 graphic window pointer
  2059.          short *x0,*y0;               origin of graphic window
  2060.  
  2061.  
  2062.          DESCRIPTION
  2063.  
  2064.          The gwdwgetorg() gets the logical origin of the graphic window
  2065.          specified by "gwptr."  The origin is returned in the arguments
  2066.          *x and *y.  It is a logical point with gwptr() as the frame
  2067.          of reference.
  2068.  
  2069.  
  2070.          RETURN VALUE
  2071.  
  2072.          None.
  2073.  
  2074.  
  2075.  
  2076.  
  2077.  
  2078.  
  2079.  
  2080.  
  2081.  
  2082.  
  2083.  
  2084.  
  2085.  
  2086.  
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092.  
  2093.  
  2094.  
  2095.  
  2096.  
  2097.  
  2098.  
  2099.  
  2100.  
  2101.  
  2102.  
  2103.  
  2104.  
  2105.  
  2106.  
  2107.  
  2108.  
  2109.          Copyright 1989, 1990 by Michael Yam        Graphic Windows  3-10
  2110.  
  2111.  
  2112.  
  2113.  
  2114.  
  2115.          MPLUS                                                   gwdwopen
  2116.  
  2117.  
  2118.          SUMMARY
  2119.  
  2120.          #include <graph.h>
  2121.          #include <gscreen.h>
  2122.          #include <gplus.h>
  2123.  
  2124.          GWDW *gwdwopen(x1,y1,x2,y2,border,fg,bg);
  2125.          short x1,y1;                 upper left corner of window
  2126.          short x2,y2;                 lower right corner of window
  2127.          short border;                border flag
  2128.          short fg;                    foreground (and border) color
  2129.          short bg;                    background color
  2130.  
  2131.  
  2132.          DESCRIPTION
  2133.  
  2134.          The function gwdwopen() opens a graphic window for text and
  2135.          graphic output using graphic coordinates.  The screen's
  2136.          background is saved and will be restored when the window is
  2137.          closed with gwdwclose().
  2138.  
  2139.          For graphic output, the upper left corner assumes logical origin
  2140.          (0,0), with x increasing from left to right, and y increasing
  2141.          from top to bottom.  For text output, the upper left corner
  2142.          takes on the text coordinate of (1,1), with rows increasing from
  2143.          top to bottom, and columns increasing from left to right.  Text
  2144.          issued with outtext() moves from left to right with automatic
  2145.          wrap, and top to bottom with automatic text scrolling.
  2146.  
  2147.          The argument "border" may be one of four manifest constants:
  2148.  
  2149.              Constant                 Action
  2150.              ----------------------------------------------------------
  2151.              _GFILLINTERIOR           The graphic window is opened
  2152.                                       without a border.
  2153.              _GBORDER                 The graphic window is opened with a
  2154.                                       border.
  2155.              _GRAISE                  The graphic window appears raised.
  2156.              _GSINK                   The graphic window appears sunken.
  2157.  
  2158.  
  2159.          For more details concerning the border, refer to the chapter
  2160.          preface.
  2161.  
  2162.          Manifest constants for graphic EGA/VGA foreground and background
  2163.          colors are available in gscreen.h.
  2164.  
  2165.  
  2166.  
  2167.  
  2168.  
  2169.  
  2170.  
  2171.  
  2172.  
  2173.  
  2174.  
  2175.          Copyright 1989, 1990 by Michael Yam        Graphic Windows  3-11
  2176.  
  2177.  
  2178.  
  2179.  
  2180.  
  2181.          MPLUS                                                   gwdwopen
  2182.  
  2183.  
  2184.          The window coordinates (x1,y1) and (x2,y2) are physical ones. An
  2185.          absolute frame of reference precludes having windows opened
  2186.          inside windows opened inside windows... and that saves a
  2187.          programmer aspirin.
  2188.  
  2189.  
  2190.          RETURN VALUE
  2191.  
  2192.          This function returns a GWDW pointer.  A NULL is returned if the
  2193.          window could not be opened.
  2194.  
  2195.  
  2196.  
  2197.  
  2198.  
  2199.  
  2200.  
  2201.  
  2202.  
  2203.  
  2204.  
  2205.  
  2206.  
  2207.  
  2208.  
  2209.  
  2210.  
  2211.  
  2212.  
  2213.  
  2214.  
  2215.  
  2216.  
  2217.  
  2218.  
  2219.  
  2220.  
  2221.  
  2222.  
  2223.  
  2224.  
  2225.  
  2226.  
  2227.  
  2228.  
  2229.  
  2230.  
  2231.  
  2232.  
  2233.  
  2234.  
  2235.  
  2236.  
  2237.  
  2238.  
  2239.  
  2240.  
  2241.          Copyright 1989, 1990 by Michael Yam        Graphic Windows  3-12
  2242.  
  2243.  
  2244.  
  2245.  
  2246.  
  2247.          MPLUS                                                gwdwsetactv
  2248.  
  2249.  
  2250.          SUMMARY
  2251.  
  2252.          #include <graph.h>
  2253.          #include <gplus.h>
  2254.  
  2255.          int gwdwsetactv(gwptr);
  2256.          GWDW *gwptr;                 graphic window pointer
  2257.  
  2258.  
  2259.          DESCRIPTION
  2260.  
  2261.          The function gwdwsetactv() makes the window specified by "gwptr"
  2262.          the active, or current, window.  The window will be available
  2263.          for graphic and text output.  Since each graphic window retains
  2264.          information about the location of its text and graphic cursor,
  2265.          along with its logical origin coordinates, window output resumes
  2266.          at the correct positions.
  2267.  
  2268.  
  2269.          RETURN VALUE
  2270.  
  2271.          This function returns a 0 if successful, a -1 on failure.
  2272.  
  2273.  
  2274.  
  2275.  
  2276.  
  2277.  
  2278.  
  2279.  
  2280.  
  2281.  
  2282.  
  2283.  
  2284.  
  2285.  
  2286.  
  2287.  
  2288.  
  2289.  
  2290.  
  2291.  
  2292.  
  2293.  
  2294.  
  2295.  
  2296.  
  2297.  
  2298.  
  2299.  
  2300.  
  2301.  
  2302.  
  2303.  
  2304.  
  2305.  
  2306.  
  2307.          Copyright 1989, 1990 by Michael Yam        Graphic Windows  3-13
  2308.  
  2309.  
  2310.  
  2311.  
  2312.  
  2313.          MPLUS                                                 gwdwsetorg
  2314.  
  2315.  
  2316.          SUMMARY
  2317.  
  2318.          #include <graph.h>
  2319.          #include <gplus.h>
  2320.  
  2321.          void gwdwsetorg(gwptr,x0,y0);
  2322.          GWDW *gwptr;                 graphic window pointer
  2323.          short x0,y0;                 logical origin
  2324.  
  2325.  
  2326.          DESCRIPTION
  2327.  
  2328.          When a graphic window is opened with the function gwdwopen(),
  2329.          the logical origin (0,0) is set to its upper left corner.  This
  2330.          may be changed with the gwdwsetorg() function which moves the
  2331.          logical origin (0,0) to the logical point ("x0","y0").  "gwptr"
  2332.          is our frame of reference.
  2333.  
  2334.  
  2335.          RETURN VALUE
  2336.  
  2337.          None.
  2338.  
  2339.  
  2340.  
  2341.  
  2342.  
  2343.  
  2344.  
  2345.  
  2346.  
  2347.  
  2348.  
  2349.  
  2350.  
  2351.  
  2352.  
  2353.  
  2354.  
  2355.  
  2356.  
  2357.  
  2358.  
  2359.  
  2360.  
  2361.  
  2362.  
  2363.  
  2364.  
  2365.  
  2366.  
  2367.  
  2368.  
  2369.  
  2370.  
  2371.  
  2372.  
  2373.          Copyright 1989, 1990 by Michael Yam        Graphic Windows  3-14
  2374.  
  2375.  
  2376.  
  2377.  
  2378.  
  2379.          MPLUS                                                  gwdwtopen
  2380.  
  2381.  
  2382.          SUMMARY
  2383.  
  2384.          #include <graph.h>
  2385.          #include <gscreen.h>
  2386.          #include <gplus.h>
  2387.  
  2388.          GWDW *gwdwtopen(r1,c1,r2,c2,border,fg,bg);
  2389.          short r1,c1;                 upper left corner of window
  2390.          short r2,c2;                 lower right corner of window
  2391.          short border;                border flag
  2392.          short fg;                    foreground (and border) color
  2393.          short bg;                    background color
  2394.  
  2395.  
  2396.          DESCRIPTION
  2397.  
  2398.          The function gwdwtopen() opens a graphic window for text and
  2399.          graphic output using text coordinates.  The screen's background
  2400.          is saved and will be restored when the window is closed with
  2401.          gwdwclose().
  2402.  
  2403.          For graphic output, the upper left corner assumes logical origin
  2404.          (0,0), with x increasing from left to right, and y increasing
  2405.          from top to bottom. For text output, the upper left corner takes
  2406.          on the text coordinate of (1,1), with rows increasing from top
  2407.          to bottom, and columns increasing from left to right.  Text
  2408.          issued with outtext() moves from left to right with automatic
  2409.          wrap, and top to bottom with automatic text scroll.
  2410.  
  2411.          The argument "border" may be one of four manifest constants:
  2412.  
  2413.              Constant                 Action
  2414.              ----------------------------------------------------------
  2415.              _GFILLINTERIOR           The graphic window is opened
  2416.                                       without a border.
  2417.              _GBORDER                 The graphic window is opened with a
  2418.                                       border.
  2419.              _GRAISE                  The graphic window appears raised.
  2420.              _GSINK                   The graphic window appears sunken.
  2421.  
  2422.  
  2423.          For more details concerning the border, refer to the chapter
  2424.          preface.
  2425.  
  2426.          Manifest constants for graphic EGA/VGA foreground and background
  2427.          colors are available in gscreen.h.
  2428.  
  2429.          The window coordinates (r1,c1) and (r2,c2) are physical
  2430.          ones.  An absolute frame of reference precludes having windows
  2431.          opened inside windows opened inside windows.
  2432.  
  2433.  
  2434.  
  2435.  
  2436.  
  2437.  
  2438.  
  2439.          Copyright 1989, 1990 by Michael Yam        Graphic Windows  3-15
  2440.  
  2441.  
  2442.  
  2443.  
  2444.  
  2445.          MPLUS                                                  gwdwtopen
  2446.  
  2447.  
  2448.          RETURN VALUE
  2449.  
  2450.          This function returns a GWDW pointer.  A NULL is returned if the
  2451.          window could not be opened.
  2452.  
  2453.  
  2454.  
  2455.  
  2456.  
  2457.  
  2458.  
  2459.  
  2460.  
  2461.  
  2462.  
  2463.  
  2464.  
  2465.  
  2466.  
  2467.  
  2468.  
  2469.  
  2470.  
  2471.  
  2472.  
  2473.  
  2474.  
  2475.  
  2476.  
  2477.  
  2478.  
  2479.  
  2480.  
  2481.  
  2482.  
  2483.  
  2484.  
  2485.  
  2486.  
  2487.  
  2488.  
  2489.  
  2490.  
  2491.  
  2492.  
  2493.  
  2494.  
  2495.  
  2496.  
  2497.  
  2498.  
  2499.  
  2500.  
  2501.  
  2502.  
  2503.  
  2504.  
  2505.          Copyright 1989, 1990 by Michael Yam        Graphic Windows  3-16
  2506.  
  2507.  
  2508.  
  2509.  
  2510.  
  2511.          MPLUS                                           GRAPHIC DIALOGUE
  2512.  
  2513.  
  2514.  
  2515.  
  2516.  
  2517.  
  2518.  
  2519.          CHAPTER  4
  2520.          ----------
  2521.  
  2522.  
  2523.  
  2524.          GRAPHIC  DIALOGUE
  2525.  
  2526.          A dialogue box presents information in a graphic window and
  2527.          solicits a response from the user.  The user response can be
  2528.          from either the mouse or keyboard.  There are three classes of
  2529.          dialogue boxes: information, warning, and error.  Any may be
  2530.          presented with the predefined prompts "Okay", "Okay/Cancel", and
  2531.          "Yes/No".
  2532.  
  2533.          The location of the box on screen is defined by the following
  2534.          relationships:
  2535.  
  2536.              row1 = _videoconfig.numtextrows / 4;
  2537.              row2 = row1 + 6;
  2538.              col1 = _videoconfig.numtextcols / 4;
  2539.              col2 = col1 * 3;
  2540.  
  2541.          Warning and error boxes are displayed with a title and have room
  2542.          for three rows of text.  The information box, having no title,
  2543.          can present four rows of text.  As for characters per line, high
  2544.          resolution graphics allows 40 while medium resolution graphics
  2545.          provides 20.  When writing to the dialogue box, text will wrap.
  2546.          Scrolling is not supported in a dialogue box; thus it is
  2547.          important not to exceed three rows of text in a warning or error
  2548.          box and four rows of text in an information box.
  2549.  
  2550.          A demo program and its source resides on the distribution disk
  2551.          as GDDEMO.EXE and GDDEMO.C, respectively.  They illustrate the
  2552.          calls to all three classes of dialogue box.
  2553.  
  2554.          Dialogue functions are prefixed with "gd."
  2555.  
  2556.  
  2557.  
  2558.  
  2559.  
  2560.  
  2561.  
  2562.  
  2563.  
  2564.  
  2565.  
  2566.  
  2567.  
  2568.  
  2569.  
  2570.  
  2571.          Copyright 1989, 1990 by Michael Yam        Graphic Dialogue  4-1
  2572.  
  2573.  
  2574.  
  2575.  
  2576.  
  2577.          MPLUS                                            Graphic Dialgue
  2578.  
  2579.  
  2580.  
  2581.  
  2582.          FUNCTION  SUMMARY
  2583.  
  2584.              Routine                  Purpose
  2585.              ----------------------------------------------------------
  2586.              gdclose()                Closes a dialogue box.
  2587.              gdialog()                Opens a dialogue box.
  2588.              gdprompt()               Solicits a response from the user.
  2589.              gdwrite()                Outputs text to dialogue box.
  2590.  
  2591.  
  2592.  
  2593.  
  2594.  
  2595.  
  2596.  
  2597.  
  2598.  
  2599.  
  2600.  
  2601.  
  2602.  
  2603.  
  2604.  
  2605.  
  2606.  
  2607.  
  2608.  
  2609.  
  2610.  
  2611.  
  2612.  
  2613.  
  2614.  
  2615.  
  2616.  
  2617.  
  2618.  
  2619.  
  2620.  
  2621.  
  2622.  
  2623.  
  2624.  
  2625.  
  2626.  
  2627.  
  2628.  
  2629.  
  2630.  
  2631.  
  2632.  
  2633.  
  2634.  
  2635.  
  2636.  
  2637.          Copyright 1989, 1990 by Michael Yam        Graphic Dialogue  4-2
  2638.  
  2639.  
  2640.  
  2641.  
  2642.  
  2643.          MPLUS                                                    gdclose
  2644.  
  2645.  
  2646.          SUMMARY
  2647.  
  2648.          #include <gplus.h>
  2649.  
  2650.          void gdclose(void);
  2651.  
  2652.  
  2653.          DESCRIPTION
  2654.  
  2655.          The gdclose() function closes the dialog box opened by
  2656.          gdialog().  Successful closure restores the screen's background.
  2657.  
  2658.  
  2659.          RETURN VALUE
  2660.  
  2661.          None.
  2662.  
  2663.  
  2664.  
  2665.  
  2666.  
  2667.  
  2668.  
  2669.  
  2670.  
  2671.  
  2672.  
  2673.  
  2674.  
  2675.  
  2676.  
  2677.  
  2678.  
  2679.  
  2680.  
  2681.  
  2682.  
  2683.  
  2684.  
  2685.  
  2686.  
  2687.  
  2688.  
  2689.  
  2690.  
  2691.  
  2692.  
  2693.  
  2694.  
  2695.  
  2696.  
  2697.  
  2698.  
  2699.  
  2700.  
  2701.  
  2702.  
  2703.          Copyright 1989, 1990 by Michael Yam        Graphic Dialogue  4-3
  2704.  
  2705.  
  2706.  
  2707.  
  2708.  
  2709.          MPLUS                                                    gdialog
  2710.  
  2711.  
  2712.          SUMMARY
  2713.  
  2714.          #include <graph.h>
  2715.          #include <gplus.h>
  2716.  
  2717.          int gdialog(dialtype,clickoption);
  2718.          char dialtype;               dialogue type: information,
  2719.                                       warning, error
  2720.          char clickoption;            response options: "okay",
  2721.                                       "okay/cancel", "yes/no"
  2722.  
  2723.  
  2724.          DESCRIPTION
  2725.  
  2726.          The gdialog() function opens a window which interacts with the
  2727.          user.  Really a canned gwdwtopen() function, gdialog() opens up
  2728.          a graphic window in the middle of the screen with colors
  2729.          determined by the parameter "dialtype" and mouse clicking options
  2730.          determined by the parameter "clickoption".  The colors described
  2731.          below apply only to EGA and VGA 16 color modes.
  2732.  
  2733.          "dialtype" may be any one of the following manifest constants
  2734.          (defined in gplus.h):
  2735.  
  2736.  
  2737.              Constant                 Meaning
  2738.              ----------------------------------------------------------
  2739.              GDINFORM                 An information box with a blue
  2740.                                       border.  Text appears in blue on a
  2741.                                       white background.
  2742.  
  2743.              GDWARN                   A warning box with a yellow border.
  2744.                                       Text appears in yellow on a black
  2745.                                       background.
  2746.  
  2747.              GDERROR                  An error box with a red border.
  2748.                                       Text appears in red on a black
  2749.                                       background.
  2750.  
  2751.  
  2752.          "clickoption" may be any one of the following manifest constants
  2753.          (defined in gplus.h):
  2754.  
  2755.              Constant                 Meaning
  2756.              ----------------------------------------------------------
  2757.              GDOKAY                   A mouse clicking region of "OKAY".
  2758.  
  2759.              GDOKCAN                  Two mouse clicking regions, the
  2760.                                       first with "OKAY", the second with
  2761.                                       "CANCEL".
  2762.  
  2763.              GDYESNO                  Two mouse clicking regions, the
  2764.                                       first with "YES", the second with
  2765.                                       "NO".
  2766.  
  2767.  
  2768.  
  2769.          Copyright 1989, 1990 by Michael Yam        Graphic Dialogue  4-4
  2770.  
  2771.  
  2772.  
  2773.  
  2774.  
  2775.          MPLUS                                                    gdialog
  2776.  
  2777.  
  2778.          RETURN VALUE
  2779.  
  2780.          This function returns a 0 if the dialog window was opened
  2781.          successfully, a -1 on error.
  2782.  
  2783.  
  2784.  
  2785.  
  2786.  
  2787.  
  2788.  
  2789.  
  2790.  
  2791.  
  2792.  
  2793.  
  2794.  
  2795.  
  2796.  
  2797.  
  2798.  
  2799.  
  2800.  
  2801.  
  2802.  
  2803.  
  2804.  
  2805.  
  2806.  
  2807.  
  2808.  
  2809.  
  2810.  
  2811.  
  2812.  
  2813.  
  2814.  
  2815.  
  2816.  
  2817.  
  2818.  
  2819.  
  2820.  
  2821.  
  2822.  
  2823.  
  2824.  
  2825.  
  2826.  
  2827.  
  2828.  
  2829.  
  2830.  
  2831.  
  2832.  
  2833.  
  2834.  
  2835.          Copyright 1989, 1990 by Michael Yam        Graphic Dialogue  4-5
  2836.  
  2837.  
  2838.  
  2839.  
  2840.  
  2841.          MPLUS                                                   gdprompt
  2842.  
  2843.  
  2844.          SUMMARY
  2845.  
  2846.          #include <graph.h>
  2847.          #include <gplus.h>
  2848.  
  2849.          int gdprompt(void)
  2850.  
  2851.  
  2852.          DESCRIPTION
  2853.  
  2854.          The gdprompt() function waits for the user to select, with a
  2855.          mouse or keyboard, a prompt from the dialog box.  To select with
  2856.          the mouse, move the cursor to the clicking region and press the
  2857.          left button.  To select with the keyboard, press the key
  2858.          corresponding to the first character of the prompt.  For
  2859.          example, to select "Okay", press the letter "O".
  2860.  
  2861.          The keys "Enter" and "Esc" also work.  "Enter" would select
  2862.          "Yes" or "Okay", and "Esc" would select "No" or "Cancel."  If
  2863.          there were only one possible choice, "Okay", either key will
  2864.          make the selection.
  2865.  
  2866.  
  2867.          RETURN VALUE
  2868.  
  2869.          This function returns a 0 or 1 depending on the prompts
  2870.          available and the user response.
  2871.  
  2872.  
  2873.              Click Option Constant    Return Value   User Selection
  2874.              ----------------------------------------------------------
  2875.              GDOKAY                   0              okay
  2876.  
  2877.              GDOKCAN                  0              okay
  2878.                                       1              cancel
  2879.  
  2880.              GDYESNO                  0              yes
  2881.                                       1              no
  2882.  
  2883.  
  2884.  
  2885.  
  2886.  
  2887.  
  2888.  
  2889.  
  2890.  
  2891.  
  2892.  
  2893.  
  2894.  
  2895.  
  2896.  
  2897.  
  2898.  
  2899.  
  2900.  
  2901.          Copyright 1989, 1990 by Michael Yam        Graphic Dialogue  4-6
  2902.  
  2903.  
  2904.  
  2905.  
  2906.  
  2907.          MPLUS                                                    gdwrite
  2908.  
  2909.  
  2910.          SUMMARY
  2911.  
  2912.          #include <graph.h>
  2913.          #include <gplus.h>
  2914.  
  2915.          int gdwrite(text);
  2916.          char *text;                  null terminated string
  2917.  
  2918.  
  2919.          DESCRIPTION
  2920.  
  2921.          The gdwrite() function outputs "text" to the dialogue box.  A
  2922.          warning or error dialogue box has room for three lines of text;
  2923.          an information box allows four lines of text.  Lines may be up
  2924.          to 40 characters long in high resolution graphics mode, and 20
  2925.          characters long in medium resolution.
  2926.  
  2927.          Text wrap is supported but scrolling is not.  Consequently, it
  2928.          is important not to exceed the number of rows allowed by a
  2929.          particular dialog box.
  2930.  
  2931.  
  2932.          RETURN VALUE
  2933.  
  2934.          This function returns a 0 if successful, a -1 on error.
  2935.  
  2936.  
  2937.  
  2938.  
  2939.  
  2940.  
  2941.  
  2942.  
  2943.  
  2944.  
  2945.  
  2946.  
  2947.  
  2948.  
  2949.  
  2950.  
  2951.  
  2952.  
  2953.  
  2954.  
  2955.  
  2956.  
  2957.  
  2958.  
  2959.  
  2960.  
  2961.  
  2962.  
  2963.  
  2964.  
  2965.  
  2966.  
  2967.          Copyright 1989, 1990 by Michael Yam        Graphic Dialogue  4-7
  2968.  
  2969.  
  2970.  
  2971.  
  2972.  
  2973.          MPLUS                                              GRAPHIC IMAGE
  2974.  
  2975.  
  2976.  
  2977.  
  2978.  
  2979.  
  2980.  
  2981.          CHAPTER  5
  2982.          ----------
  2983.  
  2984.  
  2985.  
  2986.          GRAPHIC  IMAGE
  2987.  
  2988.          The functions provided here deal with images -- picking them up,
  2989.          sliding them across the screen, and putting them down.  Of
  2990.          course functions which deal with the screen correctly must make
  2991.          sure that the mouse cursor does not interfere with the image;
  2992.          these functions hide the mouse cursor before reading or updating
  2993.          the screen, and restores the mouse cursor when done.  You will
  2994.          have to manage the mouse cursor yourself when using any of
  2995.          Microsoft's output or drawing functions.
  2996.  
  2997.          Also described here are two functions used for rubberbanding:
  2998.          xorpt() and xorline().  Consider a line where one end point is
  2999.          anchored, and the other end point is variable and designated by
  3000.          the mouse cursor.  As the user slides the mouse around, the old
  3001.          line is erased and a new line is drawn to the new end point; all
  3002.          this happens without the destruction of the background screen.
  3003.          The effect is a line that moves, stretches, compresses, and
  3004.          pretty much behaves like a rubberband.  Rubberbanding is common
  3005.          in paint programs and computer-aided design applications.
  3006.  
  3007.          Microsoft C 6.0 users: a faster alternative to xorline() would
  3008.          be to use _setwritemode(_GXOR) with _moveto() and _lineto().
  3009.  
  3010.          Moving objects and rubberbanding are made possible with the
  3011.          "exclusive or," also known as XOR.  A wonderful little operator,
  3012.          XOR behaves as follows:
  3013.  
  3014.              Table 5-1
  3015.              XOR behavior
  3016.              ---------------------------
  3017.              Bit A     Bit B     A XOR B
  3018.              1         1         0
  3019.              1         0         1
  3020.              0         1         1
  3021.              0         0         0
  3022.  
  3023.  
  3024.          When an image is XORed onto the screen, it appears on the screen
  3025.          and gets combined with the background.  When the image is XORed
  3026.          onto the screen twice, the image disappears and the background
  3027.          is restored.
  3028.  
  3029.  
  3030.  
  3031.  
  3032.  
  3033.          Copyright 1989, 1990 by Michael Yam           Graphic Image  5-1
  3034.  
  3035.  
  3036.  
  3037.  
  3038.  
  3039.          MPLUS                                              GRAPHIC IMAGE
  3040.  
  3041.  
  3042.          FUNCTION SUMMARY
  3043.  
  3044.              Routine                  Purpose
  3045.              ----------------------------------------------------------
  3046.              gpickup()                Allocates memory and saves a
  3047.                                       rectangular screen image to it.
  3048.              gputdown()               Restores an image to the screen and
  3049.                                       frees allocated memory.
  3050.              loghighlite()            Highlights an image specified by
  3051.                                       logical coordinates.
  3052.              mpgetimage()             Saves a rectangular screen image.
  3053.              mpputimage()             Restores an image to screen.
  3054.              physhighlite()           Highlights an image specified by
  3055.                                       physical coordinates.
  3056.              xorline()                Draws a line using the XOR
  3057.                                       operator.
  3058.              xorpt()                  Draws a point using the XOR
  3059.                                       operator.
  3060.  
  3061.  
  3062.  
  3063.  
  3064.  
  3065.  
  3066.  
  3067.  
  3068.  
  3069.  
  3070.  
  3071.  
  3072.  
  3073.  
  3074.  
  3075.  
  3076.  
  3077.  
  3078.  
  3079.  
  3080.  
  3081.  
  3082.  
  3083.  
  3084.  
  3085.  
  3086.  
  3087.  
  3088.  
  3089.  
  3090.  
  3091.  
  3092.  
  3093.  
  3094.  
  3095.  
  3096.  
  3097.  
  3098.  
  3099.          Copyright 1989, 1990 by Michael Yam           Graphic Image  5-2
  3100.  
  3101.  
  3102.  
  3103.  
  3104.  
  3105.          MPLUS                                                    gpickup
  3106.  
  3107.  
  3108.          SUMMARY
  3109.  
  3110.          #include <graph.h>
  3111.          #include <gplus.h>
  3112.  
  3113.          char *gpickup(x1,y1,x2,y2);
  3114.          short x1,y1;                 upper left corner of image to pickup
  3115.          short x2,y2;                 lower right corner of image to pickup
  3116.  
  3117.  
  3118.          DESCRIPTION
  3119.  
  3120.          The gpickup() function grabs into memory the portion of the
  3121.          video buffer specified by the rectangle with the logical
  3122.          coordinates (x1,y1) and (x2,y2).  This function is similar to
  3123.          Microsoft's _getimage() function but higher in level; the memory
  3124.          required to save the image is calculated and dynamically
  3125.          allocated.
  3126.  
  3127.          Use gputdown() to put down the image and free the allocated
  3128.          memory.
  3129.  
  3130.  
  3131.          RETURN VALUE
  3132.  
  3133.          This function returns to char pointer to an image buffer.  If
  3134.          the image could not be picked up, probably due to insufficient
  3135.          memory, the char pointer will be NULL.
  3136.  
  3137.  
  3138.  
  3139.  
  3140.  
  3141.  
  3142.  
  3143.  
  3144.  
  3145.  
  3146.  
  3147.  
  3148.  
  3149.  
  3150.  
  3151.  
  3152.  
  3153.  
  3154.  
  3155.  
  3156.  
  3157.  
  3158.  
  3159.  
  3160.  
  3161.  
  3162.  
  3163.  
  3164.  
  3165.          Copyright 1989, 1990 by Michael Yam           Graphic Image  5-3
  3166.  
  3167.  
  3168.  
  3169.  
  3170.  
  3171.          MPLUS                                                    gpickup
  3172.  
  3173.  
  3174.          EXAMPLE
  3175.  
  3176.          The example below slides a box across the screen.
  3177.  
  3178.          #include <graph.h>
  3179.          #include <gscreen.h>
  3180.          #include <gplus.h>
  3181.  
  3182.          extern struct videoconfig _videoconfig;
  3183.  
  3184.          main()
  3185.          {
  3186.              char *image;
  3187.              short x1, y1, x2, y2;
  3188.              short x, xwidth, xmax;
  3189.  
  3190.              mpsetvideomode( _ERESCOLOR );
  3191.  
  3192.              x1 = _videoconfig.numxpixels/2 - 10;
  3193.              y1 = _videoconfig.numypixels/2 - 10;
  3194.              x2 = _videoconfig.numxpixels/2 + 10;
  3195.              y2 = _videoconfig.numypixels/2 + 10;
  3196.              xwidth = x2-x1;
  3197.  
  3198.              _rectangle( _GFILLINTERIOR, x1, y1, x2, y2 );
  3199.              image = gpickup( x1, y1, x2, y2 );
  3200.              _clearscreen( _GCLEARSCREEN );
  3201.  
  3202.              xmax = _videoconfig.numxpixels-xwidth-1;
  3203.              for( x=0; x<xmax; ++x )
  3204.              {
  3205.                  mpputimage( x, y1, image, _GXOR );
  3206.                  mpputimage( x, y1, image, _GXOR );
  3207.              }
  3208.              gputdown( x, y1, image, _GPSET );
  3209.  
  3210.              printf("Press a key");
  3211.              getch();
  3212.  
  3213.              mpsetvideomode( _DEFAULTMODE );
  3214.              return 0;
  3215.          }
  3216.  
  3217.  
  3218.  
  3219.  
  3220.  
  3221.  
  3222.  
  3223.  
  3224.  
  3225.  
  3226.  
  3227.  
  3228.  
  3229.  
  3230.  
  3231.          Copyright 1989, 1990 by Michael Yam           Graphic Image  5-4
  3232.  
  3233.  
  3234.  
  3235.  
  3236.  
  3237.          MPLUS                                                   gputdown
  3238.  
  3239.  
  3240.          SUMMARY
  3241.  
  3242.          #include <graph.h>
  3243.          #include <gplus.h>
  3244.  
  3245.          int gputdown(x1,y1,image,action)
  3246.          short x1,y1;                 upper left coordinate of image
  3247.          char *image;                 pointer to image buffer
  3248.          short action;                interaction with existing screen image
  3249.  
  3250.  
  3251.          DESCRIPTION
  3252.  
  3253.          The gputdown() function puts an image down to screen.  The image
  3254.          must have been picked up by gpickup().
  3255.  
  3256.          The "action" parameter determines the interaction with the
  3257.          existing screen image.  Manifest constants are defined in
  3258.          graph.h and described in the Microsoft documentation for the
  3259.          _putimage() function.  The table below summarizes the available
  3260.          logical operations:
  3261.  
  3262.              Constant                 Meaning
  3263.              ----------------------------------------------------------
  3264.              _GAND                    ANDs the image to screen.
  3265.              _GOR                     ORs the image to screen.
  3266.              _GPRESET                 NOTs the image to screen.
  3267.              _GPSET                   Copies the image to screen.
  3268.              _GXOR                    XORs the image to screen.
  3269.  
  3270.  
  3271.          RETURN VALUE
  3272.  
  3273.          This function returns a 0 if the image was put down successful,
  3274.          a -1 on failure.
  3275.  
  3276.          EXAMPLE
  3277.  
  3278.          See gpickup().
  3279.  
  3280.  
  3281.  
  3282.  
  3283.  
  3284.  
  3285.  
  3286.  
  3287.  
  3288.  
  3289.  
  3290.  
  3291.  
  3292.  
  3293.  
  3294.  
  3295.  
  3296.  
  3297.          Copyright 1989, 1990 by Michael Yam           Graphic Image  5-5
  3298.  
  3299.  
  3300.  
  3301.  
  3302.  
  3303.          MPLUS                                                loghighlite
  3304.  
  3305.  
  3306.          SUMMARY
  3307.  
  3308.          #include <graph.h>
  3309.          #include <gplus.h>
  3310.  
  3311.          int loghighlite(x1,y1,x2,y2);
  3312.          short x1,y1;                 upper left corner of image to highlight
  3313.          short x2,y2;                 lower right corner of image to highlite
  3314.  
  3315.  
  3316.          DESCRIPTION
  3317.  
  3318.          The loghighlite() function produces a negative of the image in
  3319.          the rectangle described by the logical coordinates (x1,y1),
  3320.          (x2,y2).  To return the image to its original state, call this
  3321.          function a second time with the same parameters.  This
  3322.          effectively negates a negative image.
  3323.  
  3324.          Technically, all this function does is a gpickup() followed by a
  3325.          gputdown() with an "action" of _GPRESET.
  3326.  
  3327.  
  3328.          RETURN VALUE
  3329.  
  3330.          This function returns a 0 if successful.  A -1 is returned if
  3331.          there was insufficient memory for the gpickup() function.
  3332.  
  3333.  
  3334.  
  3335.  
  3336.  
  3337.  
  3338.  
  3339.  
  3340.  
  3341.  
  3342.  
  3343.  
  3344.  
  3345.  
  3346.  
  3347.  
  3348.  
  3349.  
  3350.  
  3351.  
  3352.  
  3353.  
  3354.  
  3355.  
  3356.  
  3357.  
  3358.  
  3359.  
  3360.  
  3361.  
  3362.  
  3363.          Copyright 1989, 1990 by Michael Yam           Graphic Image  5-6
  3364.  
  3365.  
  3366.  
  3367.  
  3368.  
  3369.          MPLUS                                                loghighlite
  3370.  
  3371.  
  3372.          EXAMPLE
  3373.  
  3374.          #include <graph.h>
  3375.          #include <gscreen.h>
  3376.          #include <gplus.h>
  3377.  
  3378.          main()
  3379.          {
  3380.              char *string = "Demo the highlite functions\n";
  3381.              char buffer[80];
  3382.              short x1, y1, x2, y2;
  3383.              GWDW *gwptr;
  3384.  
  3385.              mpsetvideomode( _ERESCOLOR );
  3386.              gwptr = gwdwopen(50, 50, 350, 150, _GFILLINTERIOR, BLACK, GREEN);
  3387.  
  3388.              mpouttext(string, BLACK, -1);
  3389.              mpouttext("Press a key to highlite...\n", BLACK, -1);
  3390.              getch();
  3391.  
  3392.              loghighlite( 0, 0, 300, 100 );
  3393.              mpouttext("Press a key...\n", BLACK, GREEN);
  3394.              getch();
  3395.  
  3396.              physhighlite( 50, 50, 350, 150 );
  3397.              mpouttext("Press a key...\n", BLACK, GREEN);
  3398.              getch();
  3399.              gwdwclose( gwptr );
  3400.              mpsetvideomode( _DEFAULTMODE );
  3401.              return 0;
  3402.          }
  3403.  
  3404.  
  3405.  
  3406.  
  3407.  
  3408.  
  3409.  
  3410.  
  3411.  
  3412.  
  3413.  
  3414.  
  3415.  
  3416.  
  3417.  
  3418.  
  3419.  
  3420.  
  3421.  
  3422.  
  3423.  
  3424.  
  3425.  
  3426.  
  3427.  
  3428.  
  3429.          Copyright 1989, 1990 by Michael Yam           Graphic Image  5-7
  3430.  
  3431.  
  3432.  
  3433.  
  3434.  
  3435.          MPLUS                                                 mpgetimage
  3436.  
  3437.  
  3438.          SUMMARY
  3439.  
  3440.          #include <graph.h>
  3441.          #include <gplus.h>
  3442.  
  3443.          void mpgetimage(x1,y1,x2,y2,buffer)
  3444.          short x1,y1;                 upper left corner
  3445.          short x2,y2;                 lower right corner
  3446.          char *buffer;                pointer to storage for screen image
  3447.  
  3448.  
  3449.          DESCRIPTION
  3450.  
  3451.          Like Microsoft's _getimage(), this function saves a rectangular
  3452.          screen image in a memory buffer.  Also like the original, the
  3453.          programmer is responsible for calculating and allocating memory
  3454.          for the image.  The difference is that this function will check
  3455.          for the presence of a mouse cursor and hide it before reading
  3456.          the screen.
  3457.  
  3458.  
  3459.          RETURN VALUE
  3460.  
  3461.          None.
  3462.  
  3463.  
  3464.  
  3465.  
  3466.  
  3467.  
  3468.  
  3469.  
  3470.  
  3471.  
  3472.  
  3473.  
  3474.  
  3475.  
  3476.  
  3477.  
  3478.  
  3479.  
  3480.  
  3481.  
  3482.  
  3483.  
  3484.  
  3485.  
  3486.  
  3487.  
  3488.  
  3489.  
  3490.  
  3491.  
  3492.  
  3493.  
  3494.  
  3495.          Copyright 1989, 1990 by Michael Yam           Graphic Image  5-8
  3496.  
  3497.  
  3498.  
  3499.  
  3500.  
  3501.          MPLUS                                                 mpgetimage
  3502.  
  3503.  
  3504.          EXAMPLE
  3505.  
  3506.          The example below slides a box across the screen.
  3507.  
  3508.          #include <malloc.h>
  3509.          #include <graph.h>
  3510.          #include <gscreen.h>
  3511.          #include <gplus.h>
  3512.  
  3513.          extern struct videoconfig _videoconfig;
  3514.  
  3515.          main()
  3516.          {
  3517.              char *image;
  3518.              short x1, y1, x2, y2;
  3519.              short x, xwidth, xmax;
  3520.  
  3521.              mpsetvideomode( _ERESCOLOR );
  3522.  
  3523.              _clearscreen( _GCLEARSCREEN );
  3524.              x1 = _videoconfig.numxpixels/2 - 10;
  3525.              y1 = _videoconfig.numypixels/2 - 10;
  3526.              x2 = _videoconfig.numxpixels/2 + 10;
  3527.              y2 = _videoconfig.numypixels/2 + 10;
  3528.              xwidth = x2-x1;
  3529.  
  3530.              _rectangle( _GFILLINTERIOR, x1, y1, x2, y2 );
  3531.              image = (char *)malloc( (unsigned int)_imagesize(x1,y1,x2,y2) );
  3532.              mpgetimage( x1, y1, x2, y2, image );
  3533.              _clearscreen( _GCLEARSCREEN );
  3534.              xmax = _videoconfig.numxpixels-xwidth-1;
  3535.              for( x=0; x<xmax; ++x )
  3536.              {
  3537.                   mpputimage( x, y1, image, _GXOR );
  3538.                   mpputimage( x, y1, image, _GXOR );
  3539.              }
  3540.  
  3541.              printf("Press a key");
  3542.              getch();
  3543.  
  3544.              free(image);
  3545.              mpsetvideomode( _DEFAULTMODE );
  3546.              return 0;
  3547.          }
  3548.  
  3549.  
  3550.  
  3551.  
  3552.  
  3553.  
  3554.  
  3555.  
  3556.  
  3557.  
  3558.  
  3559.  
  3560.  
  3561.          Copyright 1989, 1990 by Michael Yam           Graphic Image  5-9
  3562.  
  3563.  
  3564.  
  3565.  
  3566.  
  3567.          MPLUS                                                 mpputimage
  3568.  
  3569.  
  3570.          SUMMARY
  3571.  
  3572.          #include <graph.h>
  3573.          #include <gplus.h>
  3574.  
  3575.          void mpputimage(x1,y1,image,action)
  3576.          short x1,y1;                 upper left corner of image
  3577.          char *image;                 image storage obtained from
  3578.                                       mpgetimage()
  3579.          short action;                interaction with existing screen image
  3580.  
  3581.  
  3582.          DESCRIPTION
  3583.  
  3584.          Like Microsoft's _putimage(), this function transfers to the
  3585.          screen the contents of the "image" buffer.  Unlike Microsoft's
  3586.          version, mpputimage() ensures that the mouse cursor does not
  3587.          interfere with image being transferred.
  3588.  
  3589.          The "action" argument defines the type of interaction.  Manifest
  3590.          constants are defined in graph.h and are described in
  3591.          Microsoft's documentation of _putimage().  The table below
  3592.          summarizes the available logical operations:
  3593.  
  3594.              Constant                 Meaning
  3595.              ----------------------------------------------------------
  3596.              _GAND                    ANDs the image to screen.
  3597.              _GOR                     ORs the image to screen.
  3598.              _GPRESET                 NOTs the image to screen.
  3599.              _GPSET                   Copies the image to screen.
  3600.              _GXOR                    XORs the image to screen.
  3601.  
  3602.  
  3603.          RETURN VALUE
  3604.  
  3605.          None.
  3606.  
  3607.  
  3608.          EXAMPLE
  3609.  
  3610.          See mpgetimage().
  3611.  
  3612.  
  3613.  
  3614.  
  3615.  
  3616.  
  3617.  
  3618.  
  3619.  
  3620.  
  3621.  
  3622.  
  3623.  
  3624.  
  3625.  
  3626.  
  3627.          Copyright 1989, 1990 by Michael Yam          Graphic Image  5-10
  3628.  
  3629.  
  3630.  
  3631.  
  3632.  
  3633.          MPLUS                                               physhighlite
  3634.  
  3635.  
  3636.          SUMMARY
  3637.  
  3638.          #include <graph.h>
  3639.          #include <gplus.h>
  3640.  
  3641.          int physhighlite(x1,y1,x2,y2);
  3642.          short x1,y1;                 upper left corner of image to highlight
  3643.          short x2,y2;                 lower right corner of image to highlight
  3644.  
  3645.  
  3646.          DESCRIPTION
  3647.  
  3648.          The physhighlite() function produces a negative of the image in
  3649.          the rectangle described by the physical coordinates (x1,y1),
  3650.          (x2,y2).  To return the image to its original state, call this
  3651.          function a second time with the same parameters.  This
  3652.          effectively negates a negative image.
  3653.  
  3654.          Technically, all this function does is a gpickup() followed by a
  3655.          gputdown() with an "action" of _GPRESET.
  3656.  
  3657.  
  3658.          RETURN VALUE
  3659.  
  3660.          This function returns a 0 if successful.  A -1 is returned if
  3661.          there was insufficient memory for the gpickup() function.
  3662.  
  3663.  
  3664.          EXAMPLE
  3665.  
  3666.          See loghighlite().
  3667.  
  3668.  
  3669.  
  3670.  
  3671.  
  3672.  
  3673.  
  3674.  
  3675.  
  3676.  
  3677.  
  3678.  
  3679.  
  3680.  
  3681.  
  3682.  
  3683.  
  3684.  
  3685.  
  3686.  
  3687.  
  3688.  
  3689.  
  3690.  
  3691.  
  3692.  
  3693.          Copyright 1989, 1990 by Michael Yam          Graphic Image  5-11
  3694.  
  3695.  
  3696.  
  3697.  
  3698.  
  3699.          MPLUS                                                    xorline
  3700.  
  3701.  
  3702.          SUMMARY
  3703.  
  3704.          #include <gplus.h>
  3705.          #include <gscreen.h>
  3706.  
  3707.          void xorline(x1,y1,x2,y2,fg,bg);
  3708.          short x1,y1;                 starting point for line
  3709.          short x2,y2;                 ending point for line
  3710.          short fg;                    foreground color of line
  3711.          short bg;                    current background color
  3712.  
  3713.          DESCRIPTION
  3714.  
  3715.          This routine is a non-destructive line drawing function since it
  3716.          uses the "exclusive or" (see chapter preface).  The line may be
  3717.          removed from the screen and the background restored by calling
  3718.          this function again with the same parameters.
  3719.  
  3720.          Manifest constants are available for EGA/VGA modes in gscreen.h
  3721.          for the foreground and background colors.
  3722.  
  3723.          Microsoft C 6.0 users: a faster alternative to xorline() would
  3724.          be to use _setwritemode(_GXOR) with _moveto() and _lineto().
  3725.  
  3726.  
  3727.          RETURN VALUE
  3728.  
  3729.          None.
  3730.  
  3731.  
  3732.          EXAMPLE
  3733.  
  3734.          The example below firsts opens a graphic window and outputs some
  3735.          text.  Then two xor lines criss cross the window, illustrating
  3736.          their non-destructive characteristics.
  3737.  
  3738.          #include <graph.h>
  3739.          #include <gplus.h>
  3740.          #include <gscreen.h>
  3741.  
  3742.          /*      MRES 4 color defines for palette 3
  3743.           */
  3744.          #define MBLACK          0
  3745.          #define MLIGHTCYAN      1
  3746.          #define MLIGHTMAGENTA   2
  3747.          #define MWHITE          3
  3748.  
  3749.  
  3750.  
  3751.  
  3752.  
  3753.  
  3754.  
  3755.  
  3756.  
  3757.  
  3758.  
  3759.          Copyright 1989, 1990 by Michael Yam          Graphic Image  5-12
  3760.  
  3761.  
  3762.  
  3763.  
  3764.  
  3765.          MPLUS                                                    xorline
  3766.  
  3767.  
  3768.          main()
  3769.          {
  3770.              short x, y;
  3771.              short xinc, yinc;
  3772.              GWDW *gwptr;
  3773.  
  3774.              mpsetvideomode( _MRES4COLOR );
  3775.              _selectpalette(3);
  3776.              gwptr = gwdwopen( 50, 50, 250, 150, _GFILLINTERIOR, MBLACK, MWHITE );
  3777.              mpouttext( "Demo of non-\ndestructive xor lines.\n", MBLACK, -1 );
  3778.              mpouttext( "Press a key to quit.\n", MBLACK, -1 );
  3779.  
  3780.              x=0;
  3781.              y=0;
  3782.              while(1)
  3783.              {
  3784.                  xorline( 0, y, 200, y, MLIGHTCYAN, -1);
  3785.                  xorline( x, 0, x, 100, MLIGHTMAGENTA, -1);
  3786.                  xorline( 0, y, 200, y, MLIGHTCYAN, -1);
  3787.                  xorline( x, 0, x, 100, MLIGHTMAGENTA, -1);
  3788.                  if( x >= 200 )
  3789.                      xinc = -1;
  3790.                  else if( x <= 0 )
  3791.                      xinc = 1;
  3792.                  x += xinc;
  3793.  
  3794.                  if( y >= 100 )
  3795.                      yinc = -1;
  3796.                  else if( y <= 0 )
  3797.                      yinc = 1;
  3798.                  y += yinc;
  3799.  
  3800.                  if( kbhit() )
  3801.                      break;
  3802.              }
  3803.              gwdwclose( gwptr );
  3804.              mpsetvideomode( _DEFAULTMODE );
  3805.          }
  3806.  
  3807.  
  3808.  
  3809.  
  3810.  
  3811.  
  3812.  
  3813.  
  3814.  
  3815.  
  3816.  
  3817.  
  3818.  
  3819.  
  3820.  
  3821.  
  3822.  
  3823.  
  3824.  
  3825.          Copyright 1989, 1990 by Michael Yam          Graphic Image  5-13
  3826.  
  3827.  
  3828.  
  3829.  
  3830.  
  3831.          MPLUS                                                      xorpt
  3832.  
  3833.  
  3834.          SUMMARY
  3835.  
  3836.          #include <gplus.h>
  3837.          #include <gscreen.h>
  3838.  
  3839.          void xorpt(x,y,fg,bg);
  3840.          short x,y;                   point position
  3841.          short fg;                    color it should appear in
  3842.          short bg;                    current background color
  3843.  
  3844.  
  3845.          DESCRIPTION
  3846.  
  3847.          This routine is a non-destructive point plotting function since
  3848.          it uses the "exclusive or" (see chapter preface).  The point may
  3849.          be removed from the screen and the background restored by
  3850.          calling the function again with the same parameters.
  3851.  
  3852.          Manifest constants are available for EGA/VGA modes in gscreen.h
  3853.          for the foreground and background colors.
  3854.  
  3855.          This function is provided for those who need to design routines
  3856.          such as xorellipse().  Unlike MPLUS' other image functions,
  3857.          xorpt() does no cursor checking since it is very inefficient to
  3858.          examine the mouse cursor every time a point is plotted.
  3859.          Instead, when writing a routine such as xorellipse(), if the
  3860.          cursor is visible, hide it at the start of the function and
  3861.          restore it at the end of the function.
  3862.  
  3863.  
  3864.          RETURN VALUE
  3865.  
  3866.          None.
  3867.  
  3868.  
  3869.  
  3870.  
  3871.  
  3872.  
  3873.  
  3874.  
  3875.  
  3876.  
  3877.  
  3878.  
  3879.  
  3880.  
  3881.  
  3882.  
  3883.  
  3884.  
  3885.  
  3886.  
  3887.  
  3888.  
  3889.  
  3890.  
  3891.          Copyright 1989, 1990 by Michael Yam          Graphic Image  5-14
  3892.  
  3893.  
  3894.  
  3895.  
  3896.  
  3897.          MPLUS                                                   MENU BAR
  3898.  
  3899.  
  3900.  
  3901.  
  3902.  
  3903.  
  3904.  
  3905.          CHAPTER  6
  3906.          ----------
  3907.  
  3908.  
  3909.  
  3910.          THE  MENU  BAR
  3911.  
  3912.          The functions described in this chapter create a horizontal bar
  3913.          menu with pull down windows.  Depending upon available memory
  3914.          and screen space, up to five levels of submenus are supported,
  3915.          although two levels should be sufficient for most applications.
  3916.          The menu also supports "greyout", a technique used to disable a
  3917.          menu choice.  Menu functions are prefixed with an "mb_".
  3918.  
  3919.          The mouse and keyboard are supported input devices.  To make a
  3920.          menu selection with a mouse, position the cursor in the bar,
  3921.          over a menu title.  Pressing the left button will highlight the
  3922.          menu title and open a pull-down menu. The button must be held
  3923.          down to keep pull-down menu open.  To close the pull-down menu
  3924.          and open others, keep the left button down and slide the cursor
  3925.          over to other titles along the bar.
  3926.  
  3927.          To select one of the options in the pull-down menu, drag the
  3928.          cursor over one of the choices and release the left button.  If
  3929.          no selection is desired, slide the cursor out of the pull-down
  3930.          menu and release the left button.
  3931.  
  3932.          Using a keyboard to select from the menu bar requires an "Alt"
  3933.          key combined with the first character of the desired menu title.
  3934.          This opens a pull-down menu.  The left and right cursor keys may
  3935.          be used to enter submenus (if present) or to close the current
  3936.          pull-down menu and open adjacent menus.  "Tab" and "Shift Tab"
  3937.          behave similarly, except they bypass all submenus.
  3938.  
  3939.          Use the up and down cursor keys to point to titles within the
  3940.          pull-down menu.  These selections may also be made by pressing
  3941.          the first character of the titles (no "Alt" this time).  If more
  3942.          than one title begins with the same character, pressing that
  3943.          character again will point to the next matching selection.
  3944.          Pressing "Return" makes the decision final while pressing "Esc"
  3945.          just closes the pull-down menu with no further action.
  3946.  
  3947.  
  3948.  
  3949.  
  3950.  
  3951.  
  3952.  
  3953.  
  3954.  
  3955.  
  3956.  
  3957.          Copyright 1989, 1990 by Michael Yam                Menu Bar  6-1
  3958.  
  3959.  
  3960.  
  3961.  
  3962.  
  3963.          MPLUS                                                   MENU BAR
  3964.  
  3965.  
  3966.          Setting up your menus require plugging in titles and pointers to
  3967.          functions into two structures:
  3968.  
  3969.          struct MENU_INFO
  3970.          {
  3971.              int  exitkey;       /* quit key */
  3972.              int  (*exitfun)();  /* ptr to quit function */
  3973.              word fg0, bg0;      /* color of menu bar */
  3974.              word keycolor0;     /* color of ALT KEY */
  3975.              word greyout0;      /* color of disabled bar title */
  3976.              word border;        /* border flag */
  3977.              word fg, bg;        /* color of pull-down menu */
  3978.              word keycolor;      /* color of title's first char */
  3979.              word greyout;       /* color of disabled title */
  3980.          };
  3981.  
  3982.          struct MENU_ITEM
  3983.          {
  3984.              char *title;                  /* title string */
  3985.              int (*function)();            /* ptr to function */
  3986.              struct MENU_ITEM *menu_item;  /* titles for submenu */
  3987.              unsigned submenu: 1           /* bit indicates submenu */
  3988.              unsigned greyout: 1           /* bit disables title */
  3989.  
  3990.              /* Remaining six bits reserved for future */
  3991.          };
  3992.  
  3993.  
  3994.          The structure MENU_INFO is used to define various attributes of
  3995.          the menu, including its colors, an exit key, and an exit
  3996.          function.  Regarding colors, you may initialize them to a
  3997.          default set with the function mb_stdcolors().  See the function
  3998.          description for details.
  3999.  
  4000.          Defining an exit key and an exit function would save the user
  4001.          from hunting through an array of menus to find that "quit"
  4002.          function.  The exit key may be any key that has a scan and
  4003.          ascii code, but typically would be "Esc", "Ctrl Q", or "Alt X".
  4004.          The function mb_run() will watch for the assigned key and if
  4005.          detected, return a pointer to your exit function.
  4006.  
  4007.              Suggested Exit Keys      Scan and Ascii Code
  4008.              --------------------------------------------
  4009.              Esc                      0x011B
  4010.              Ctrl Q                   0x1011
  4011.              Alt X                    0x2D00
  4012.  
  4013.  
  4014.          The structure MENU_ITEM is used to store your menu titles,
  4015.          pointers to functions, submenu titles, and other menu
  4016.          attributes.  Examples of initializing this structure can be
  4017.          found in the function description for mb_open() and in the file
  4018.          MENUDEMO.C
  4019.  
  4020.  
  4021.  
  4022.  
  4023.          Copyright 1989, 1990 by Michael Yam                Menu Bar  6-2
  4024.  
  4025.  
  4026.  
  4027.  
  4028.  
  4029.          MPLUS                                                   MENU BAR
  4030.  
  4031.  
  4032.          Pre 1.3 Versions of MPLUS.
  4033.          --------------------------
  4034.  
  4035.          The menu system here departs from the architecture used in
  4036.          versions of MPLUS prior to 1.3.  For this I apologize but the
  4037.          early design could not handle submenus effectively.  Migration
  4038.          isn't difficult, as a comparison of the demo routines in
  4039.          BMDEMO.C (old way) and MENUDEMO.C (new way) reveals.
  4040.  
  4041.          The table below lists the obsolete menu functions and their
  4042.          new (near) equivalents.
  4043.  
  4044.              Obsolete                 Replacements
  4045.              ---------------------------------------------------
  4046.              bm_exit()                Set in MENU_INFO structure
  4047.              bm_init()                mb_open()
  4048.              bm_run()                 mb_run()
  4049.              bm_show()                mb_open()
  4050.  
  4051.  
  4052.          The header BARMENU.H is also obsolete and should be replaced
  4053.          with MPMENU.H.
  4054.  
  4055.  
  4056.          FUNCTION SUMMARY
  4057.  
  4058.              Routine                  Purpose
  4059.              ----------------------------------------------------------
  4060.              mb_close()               Closes and removes menu bar.
  4061.              mb_open()                Initializes a menu bar and displays
  4062.                                       it on screen.
  4063.              mb_run()                 Runs the menu bar.
  4064.              mb_stdcolors()           Initialize menu system to a default
  4065.                                       set of colors (EGA & VGA only).
  4066.  
  4067.  
  4068.  
  4069.  
  4070.  
  4071.  
  4072.  
  4073.  
  4074.  
  4075.  
  4076.  
  4077.  
  4078.  
  4079.  
  4080.  
  4081.  
  4082.  
  4083.  
  4084.  
  4085.  
  4086.  
  4087.  
  4088.  
  4089.          Copyright 1989, 1990 by Michael Yam                Menu Bar  6-3
  4090.  
  4091.  
  4092.  
  4093.  
  4094.  
  4095.          MPLUS                                                   mb_close
  4096.  
  4097.  
  4098.          SUMMARY
  4099.  
  4100.          #include <stdio.h>
  4101.          #include <graph.h>
  4102.          #include <gplus.h>
  4103.          #include <mpmenu.h>
  4104.  
  4105.          int mb_close(void);
  4106.  
  4107.  
  4108.          DESCRIPTION
  4109.  
  4110.          The mb_close() function closes the menu bar, and removes it from
  4111.          the screen, restoring the original background.
  4112.  
  4113.  
  4114.          RETURN VALUE
  4115.  
  4116.          This function returns a 0 if the menu bar was closed
  4117.          successfully.  A -1 is returned on failure.
  4118.  
  4119.  
  4120.  
  4121.  
  4122.  
  4123.  
  4124.  
  4125.  
  4126.  
  4127.  
  4128.  
  4129.  
  4130.  
  4131.  
  4132.  
  4133.  
  4134.  
  4135.  
  4136.  
  4137.  
  4138.  
  4139.  
  4140.  
  4141.  
  4142.  
  4143.  
  4144.  
  4145.  
  4146.  
  4147.  
  4148.  
  4149.  
  4150.  
  4151.  
  4152.  
  4153.  
  4154.  
  4155.          Copyright 1989, 1990 by Michael Yam                Menu Bar  6-4
  4156.  
  4157.  
  4158.  
  4159.  
  4160.  
  4161.          MPLUS                                                    mb_open
  4162.  
  4163.  
  4164.          SUMMARY
  4165.  
  4166.          #include <stdio.h>
  4167.          #include <graph.h>
  4168.          #include <gplus.h>
  4169.          #include <mpmenu.h>
  4170.  
  4171.          int mb_open(r1,c1,c2,struct MENU_INFO menu_info,
  4172.                      struct MENU_ITEM menu_item);
  4173.          short r1, c1;                starting row and col of menu bar
  4174.          short c2;                    ending col of menu bar
  4175.          struct MENU_INFO *menu_info; menu colors, etc.
  4176.          struct MENU_ITEM *menu_item; titles, function ptrs, etc.
  4177.  
  4178.  
  4179.          DESCRIPTION
  4180.  
  4181.          The mb_open() function initializes the menu system with the
  4182.          information provided in the structures MENU_INFO and MENU_ITEM.
  4183.          mb_open() then opens the menu bar at the row and column
  4184.          specified by the "r1" and "c1" parameters.  The bar ends at
  4185.          "c2."
  4186.  
  4187.  
  4188.          RETURN VALUE
  4189.  
  4190.          This function returns a 0 if successful.  A -1 is returned on
  4191.          failure.
  4192.  
  4193.  
  4194.  
  4195.  
  4196.  
  4197.  
  4198.  
  4199.  
  4200.  
  4201.  
  4202.  
  4203.  
  4204.  
  4205.  
  4206.  
  4207.  
  4208.  
  4209.  
  4210.  
  4211.  
  4212.  
  4213.  
  4214.  
  4215.  
  4216.  
  4217.  
  4218.  
  4219.  
  4220.  
  4221.          Copyright 1989, 1990 by Michael Yam                Menu Bar  6-5
  4222.  
  4223.  
  4224.  
  4225.  
  4226.  
  4227.          MPLUS                                                    mb_open
  4228.  
  4229.  
  4230.          FRAGMENT
  4231.  
  4232.          The following code fragment initializes the menu structures and
  4233.          opens a menu bar:
  4234.  
  4235.  
  4236.          #define  _ESC 0x011B
  4237.  
  4238.          extern int exitfun();             /* Your exit function */
  4239.          extern int dummy();               /* Just for illustration */
  4240.                   :
  4241.                   :
  4242.          struct MENU_INFO menu_info =
  4243.          {
  4244.              _ESC, exitfun,                /* Exit key & function */
  4245.              BLACK, WHITE, RED, GREY,      /* Menu bar attributes */
  4246.              _GBORDER,                     /* Border for pull-down */
  4247.              BLUE, WHITE, BLUE, GREY,      /* Pull-down attributes */
  4248.          };
  4249.  
  4250.          /* m0m0 submenu - called from menu 0, item 0. */
  4251.  
  4252.          struct MENU_ITEM m0m0[] =
  4253.          {
  4254.              "Methanol", NULL, NULL, 0,1,  /* Functions don't exist */
  4255.              "Ethanol",  NULL, NULL, 0,1,  /* Mark greyout */
  4256.              "Martini", dummy, NULL,0,0,   /* This calls dummy() */
  4257.              NULL, NULL, NULL, 0,0,        /* Terminate list */
  4258.          };
  4259.  
  4260.          /* m0 - Menu 0 */
  4261.  
  4262.          struct MENU_ITEM m0[] =           /* Main menu bar */
  4263.          {
  4264.              "Alcohols", NULL, m0m0, 1,0,  /* Mark submenu */
  4265.              NULL, NULL, NULL, 0,0,        /* Terminate list */
  4266.          };
  4267.                   :
  4268.                   :
  4269.          main()
  4270.          {
  4271.                   :
  4272.                   :
  4273.              mb_open (1, 1, 80, &menu_info, m0);
  4274.                   :
  4275.                   :
  4276.              mb_close();
  4277.                   :
  4278.                   :
  4279.          };
  4280.  
  4281.  
  4282.  
  4283.  
  4284.  
  4285.  
  4286.  
  4287.          Copyright 1989, 1990 by Michael Yam                Menu Bar  6-6
  4288.  
  4289.  
  4290.  
  4291.  
  4292.  
  4293.          MPLUS                                                     mb_run
  4294.  
  4295.  
  4296.          SUMMARY
  4297.  
  4298.          #include <graph.h>
  4299.          #include <gscreen.h>
  4300.          #include <gplus.h>
  4301.          #include <mpmenu.h>
  4302.  
  4303.          int (*mb_run(void))();
  4304.  
  4305.  
  4306.          DESCRIPTION
  4307.  
  4308.          The mb_run() function will run the bar menu after proper
  4309.          structure initialization.  It will respond to the user's inputs
  4310.          -- mouse or keyboard -- and open and close windows accordingly.
  4311.          If there is no input, this function simply returns a NULL
  4312.          pointer.
  4313.  
  4314.  
  4315.          RETURN VALUE
  4316.  
  4317.          The return value depends on the user input.  If the input was
  4318.          valid, a pointer to a function is returned.  If the input was
  4319.          invalid, or there was no input, the pointer returned is NULL.
  4320.  
  4321.          It is up to the programmer to decide what to do with the pointer
  4322.          returned.  Normally, the function should be called.  Returning a
  4323.          pointer to the function instead of executing it from within
  4324.          mb_run() lets the programmer call the function with arguments.
  4325.  
  4326.  
  4327.          FRAGMENT
  4328.  
  4329.          This fragment runs the menu system as long as the exit function
  4330.          isn't called:
  4331.  
  4332.          extern int exitfun();
  4333.                   :
  4334.                   :
  4335.          int (*function)();           /* function pointer */
  4336.                   :
  4337.                   :
  4338.          function = NULL;
  4339.          while (function != exitfun || ret != 0)
  4340.          {
  4341.              function = mb_run();
  4342.              if (function != NULL)
  4343.                   ret = function();   /* execute.  Can pass args. */
  4344.          };
  4345.                   :
  4346.                   :
  4347.  
  4348.  
  4349.  
  4350.  
  4351.  
  4352.  
  4353.          Copyright 1989, 1990 by Michael Yam                Menu Bar  6-7
  4354.  
  4355.  
  4356.  
  4357.  
  4358.  
  4359.          MPLUS                                               mb_stdcolors
  4360.  
  4361.  
  4362.          SUMMARY
  4363.  
  4364.          #include <graph.h>
  4365.          #include <gscreen.h>
  4366.          #include <gplus.h>
  4367.          #include <mpmenu.h>
  4368.  
  4369.          void mb_stdcolors(menu_info);
  4370.          struct MENU_INFO *menu_info;      structure to init
  4371.  
  4372.  
  4373.          DESCRIPTION
  4374.  
  4375.          The mb_stdcolors() function initializes the menu system with a
  4376.          set of default colors.  This function is provided for
  4377.          convenience and is easy to customize.  It assumes EGA and VGA 16
  4378.          color modes.
  4379.  
  4380.  
  4381.          RETURN VALUE
  4382.  
  4383.          None.
  4384.  
  4385.  
  4386.          FRAGMENT
  4387.  
  4388.          Reproduced here is the source to mb_stdcolors().  The color
  4389.          combinations look best on a grey background.  Structure elements
  4390.          suffixed with a "0" refer to the menu bar, while the remaining
  4391.          elements refer to the pull-down menu.
  4392.  
  4393.  
  4394.          void mb_stdcolors(menu_info)
  4395.          struct MENU_INFO *menu_info;
  4396.          {
  4397.              menu_info->fg0 = BLACK;
  4398.              menu_info->bg0 = WHITE;
  4399.              menu_info->keycolor0 = RED;
  4400.              menu_info->greyout0 = GREY;
  4401.              menu_info->border = _GBORDER;
  4402.              menu_info->fg = BLACK;
  4403.              menu_info->bg = WHITE;
  4404.              menu_info->keycolor = BLACK;
  4405.              menu_info->greyout = GREY;
  4406.              return;
  4407.          }
  4408.  
  4409.  
  4410.  
  4411.  
  4412.  
  4413.  
  4414.  
  4415.  
  4416.  
  4417.  
  4418.  
  4419.          Copyright 1989, 1990 by Michael Yam                Menu Bar  6-8
  4420.  
  4421.  
  4422.  
  4423.  
  4424.  
  4425.          MPLUS                                                     MOUSER
  4426.  
  4427.  
  4428.  
  4429.  
  4430.  
  4431.  
  4432.  
  4433.          CHAPTER  7
  4434.          ----------
  4435.  
  4436.  
  4437.          MOUSER -- with respect to the most famous mouser of them all,
  4438.                    "Sylvester the Cat."
  4439.  
  4440.          The routines here support a Microsoft or compatible mouse and
  4441.          provide a range of services from resetting the mouse to
  4442.          retrieving input from either the mouse or keyboard.  If no mouse
  4443.          is present, calling these functions will have no effect.
  4444.  
  4445.          Note that these functions are valid only in graphic video modes;
  4446.          text modes are not supported.  When using Microsoft's graphics
  4447.          output routines, remember to hide the mouse before updating or
  4448.          reading the screen.  Otherwise, the mouse will interfere with
  4449.          the screen image.  Except where indicated, all MPLUS functions
  4450.          handle the mouse automatically.
  4451.  
  4452.          A few routines reference a structure named "ms_status."  It is
  4453.          defined in mouser.h and has the following elements:
  4454.  
  4455.              struct ms_status
  4456.              {
  4457.                   unsigned int condmask;   event mask or type of activity
  4458.                   int lbtn;                left button: 0 = up, 1 = down
  4459.                   int lbpress;             the number of left button presses
  4460.                   int lbrelease;           the number of left button releases
  4461.                   int rbtn;                right button: 0 = up, 1 = down
  4462.                   int rbpress;             the number of right button presses
  4463.                   int rbrelease;           the number of right button releases
  4464.                   short x, y;              mouse cursor position
  4465.              }
  4466.  
  4467.          Mouse activity is returned in this structure for easy reference.
  4468.          Note that the element "condmask", currently used only by
  4469.          dev_ready(), is a mask which defines the type of mouse activity
  4470.          the user applied.  It can have one or a combination of
  4471.          the following values:
  4472.  
  4473.              Constant       Hex Value      Meaning
  4474.              ---------------------------------------------------
  4475.              _CSRMOVED      0x01           cursor moved
  4476.              _LBPRESSED     0x02           left button pressed
  4477.              _LBRELEASED    0x04           left button released
  4478.              _RBPRESSED     0x08           right button pressed
  4479.              _RBRELEASED    0x10           right button released
  4480.  
  4481.  
  4482.  
  4483.  
  4484.  
  4485.          Copyright 1989, 1990 by Michael Yam                   Mouser 7-1
  4486.  
  4487.  
  4488.  
  4489.  
  4490.  
  4491.          MPLUS                                                     MOUSER
  4492.  
  4493.  
  4494.          FUNCTION SUMMARY
  4495.  
  4496.              Routine                  Purpose
  4497.              ----------------------------------------------------------
  4498.              dev_ready()              Checks the keyboard and mouse for
  4499.                                       input.
  4500.              ginrectangle()           Determines if point x,y lies in a
  4501.                                       rectangle or not.
  4502.              ginwindow()              Determines if point x,y lies in a
  4503.                                       graphic window or not.
  4504.              ms_cursor()              Returns the status of the cursor --
  4505.                                       on or off.
  4506.              ms_getposition()         Gets the cursor position and the
  4507.                                       status of the mouse buttons.
  4508.              ms_getpress()            Retrieves the status of the
  4509.                                       specified button and the number of
  4510.                                       times it was pressed since this
  4511.                                       function was last called.
  4512.              ms_getrelease()          Retrieves the status of the
  4513.                                       specified button and the number of
  4514.                                       times it was released since this
  4515.                                       function was last called.
  4516.              ms_hidecursor()          Hides the cursor.
  4517.              ms_poll()                Polls the mouse for input.
  4518.              ms_ready()               Determines if the mouse has input.
  4519.              ms_reset()               Resets the mouse driver.
  4520.              ms_setevent()            Enables/Disables mouse event
  4521.                                       checking.
  4522.              ms_setposition()         Positions the cursor at specified
  4523.                                       coordinates.
  4524.              ms_showcursor()          Displays the cursor on the screen.
  4525.              ms_window()              Defines the screen region where the
  4526.                                       cursor may roam.
  4527.  
  4528.  
  4529.  
  4530.  
  4531.  
  4532.  
  4533.  
  4534.  
  4535.  
  4536.  
  4537.  
  4538.  
  4539.  
  4540.  
  4541.  
  4542.  
  4543.  
  4544.  
  4545.  
  4546.  
  4547.  
  4548.  
  4549.  
  4550.  
  4551.          Copyright 1989, 1990 by Michael Yam                   Mouser 7-2
  4552.  
  4553.  
  4554.  
  4555.  
  4556.  
  4557.          MPLUS                                                  dev_ready
  4558.  
  4559.  
  4560.          SUMMARY
  4561.  
  4562.          #include <mouser.h>
  4563.  
  4564.          int dev_ready(ch,ms_status);
  4565.          int *ch;                     the keystroke pressed
  4566.          struct ms_status *ms_status; the mouse status
  4567.  
  4568.  
  4569.          DESCRIPTION
  4570.  
  4571.          The dev_ready() function checks the keyboard and the mouse for
  4572.          input, then returns the active device.  If there was a keystroke
  4573.          in the keyboard buffer, it would be retrieved and stored in
  4574.          "ch."  If the mouse was active, its status would be retrieved
  4575.          and stored in "ms_status."  If neither device was accessed by
  4576.          the user, the function would return a NULL.
  4577.  
  4578.          When a mouse is moved or its buttons pressed or released, an
  4579.          interrupt is generated and signals dev_ready() that there is
  4580.          mouse input.  "condmask" is a bit mask which identifies the
  4581.          mouse activity which triggered the interrupt.  Possible masks
  4582.          are defined in mouser.h and are discussed in the chapter
  4583.          preface.
  4584.  
  4585.          Mouse event checking must be enabled for this function to work.
  4586.          This is accomplished with:
  4587.  
  4588.              ms_setevent(1);
  4589.  
  4590.  
  4591.          RETURN VALUE
  4592.  
  4593.          Constants defining the returned devices are in mouser.h and are
  4594.          listed below.
  4595.  
  4596.              Constant            Meaning
  4597.              -----------------------------
  4598.              _KB                 Keyboard
  4599.              _MS                 Mouse
  4600.              NULL                No device
  4601.  
  4602.  
  4603.  
  4604.  
  4605.  
  4606.  
  4607.  
  4608.  
  4609.  
  4610.  
  4611.  
  4612.  
  4613.  
  4614.  
  4615.  
  4616.  
  4617.          Copyright 1989, 1990 by Michael Yam                   Mouser 7-3
  4618.  
  4619.  
  4620.  
  4621.  
  4622.  
  4623.          MPLUS                                                  dev_ready
  4624.  
  4625.  
  4626.          EXAMPLE
  4627.  
  4628.          #include <graph.h>
  4629.          #include <gplus.h>
  4630.          #include <mouser.h>
  4631.  
  4632.          main()
  4633.          {
  4634.              int ch;
  4635.              struct ms_status ms_status;
  4636.              int device;
  4637.  
  4638.              ms_reset();
  4639.              ms_setevent(1);
  4640.              mpsetvideomode( _DEFAULTMODE );
  4641.  
  4642.              /*       Press a key or access mouse.
  4643.               */
  4644.              while( !(device = dev_ready( &ch, &ms_status )) );
  4645.  
  4646.              if( device == _KB )
  4647.                  printf("\nKeyboard pressed.  Code = %x hex\n", ch);
  4648.              else if( device == _MS )
  4649.                  printf("\nMouse pressed or moved.  Mask = %x hex\n",
  4650.                          ms_status.condmask);
  4651.  
  4652.              ms_reset();
  4653.          }
  4654.  
  4655.  
  4656.  
  4657.  
  4658.  
  4659.  
  4660.  
  4661.  
  4662.  
  4663.  
  4664.  
  4665.  
  4666.  
  4667.  
  4668.  
  4669.  
  4670.  
  4671.  
  4672.  
  4673.  
  4674.  
  4675.  
  4676.  
  4677.  
  4678.  
  4679.  
  4680.  
  4681.  
  4682.  
  4683.          Copyright 1989, 1990 by Michael Yam                   Mouser 7-4
  4684.  
  4685.  
  4686.  
  4687.  
  4688.  
  4689.          MPLUS                                               ginrectangle
  4690.  
  4691.  
  4692.          SUMMARY
  4693.  
  4694.          #include <graph.h>
  4695.          #include <gplus.h>
  4696.  
  4697.          int ginrectangle(x0,y0,x1,y1,x2,y2);
  4698.          short x0,y0;                 point to check
  4699.          short x1,y1;                 upper left coordinate
  4700.          short x2,y2;                 lower right coordinate
  4701.  
  4702.  
  4703.          DESCRIPTION
  4704.  
  4705.          The ginrectangle() function determines if the point described by
  4706.          (x0,y0) lies inside the rectangle described by (x1,y1,x2,y2).
  4707.          The point in question and the rectangle coordinates may be
  4708.          either physical points or logical points.  For a meaningful
  4709.          comparison, if point (x0,y0) is physical, the rectangle
  4710.          coordinates should be physical.  Likewise, if point (x0,y0) is
  4711.          logical, the rectangle coordinates should also be logical.
  4712.  
  4713.  
  4714.          RETURN VALUE
  4715.  
  4716.          This function returns a 1 if the point is in the rectangle.  A 0
  4717.          is returned if the point is outside the rectangle.
  4718.  
  4719.  
  4720.  
  4721.  
  4722.  
  4723.  
  4724.  
  4725.  
  4726.  
  4727.  
  4728.  
  4729.  
  4730.  
  4731.  
  4732.  
  4733.  
  4734.  
  4735.  
  4736.  
  4737.  
  4738.  
  4739.  
  4740.  
  4741.  
  4742.  
  4743.  
  4744.  
  4745.  
  4746.  
  4747.  
  4748.  
  4749.          Copyright 1989, 1990 by Michael Yam                   Mouser 7-5
  4750.  
  4751.  
  4752.  
  4753.  
  4754.  
  4755.          MPLUS                                               ginrectangle
  4756.  
  4757.  
  4758.          EXAMPLE
  4759.  
  4760.          #include <stdio.h>
  4761.          #include <graph.h>
  4762.  
  4763.          #include <gplus.h>
  4764.  
  4765.          main()
  4766.          {
  4767.              short x1,y1,x2,y2;
  4768.  
  4769.              x1 = 80;
  4770.              y1 = 50;
  4771.              x2 = 240;
  4772.              y2 = 150;
  4773.  
  4774.              mpsetvideomode( _MRES4COLOR );
  4775.              _rectangle( _GBORDER, x1, y1, x2, y2 );
  4776.  
  4777.              if( ginrectangle( 80, 50, x1, y1, x2, y2 ) )
  4778.                  printf("point 80, 50 is in the rectangle\n");
  4779.              else
  4780.                  printf("point 80, 50 is not in the rectangle\n");
  4781.  
  4782.              if( ginrectangle( 79, 50, x1, y1, x2, y2 ) )
  4783.                  printf("point 79, 50 is in the rectangle\n");
  4784.              else
  4785.                  printf("point 79, 50 is not in the rectangle\n");
  4786.  
  4787.              getch();                /* strike a key to continue */
  4788.              mpsetvideomode( _DEFAULTMODE );
  4789.          }
  4790.  
  4791.  
  4792.  
  4793.  
  4794.  
  4795.  
  4796.  
  4797.  
  4798.  
  4799.  
  4800.  
  4801.  
  4802.  
  4803.  
  4804.  
  4805.  
  4806.  
  4807.  
  4808.  
  4809.  
  4810.  
  4811.  
  4812.  
  4813.  
  4814.  
  4815.          Copyright 1989, 1990 by Michael Yam                   Mouser 7-6
  4816.  
  4817.  
  4818.  
  4819.  
  4820.  
  4821.          MPLUS                                                  ginwindow
  4822.  
  4823.  
  4824.          SUMMARY
  4825.  
  4826.          #include <graph.h>
  4827.          #include <gplus.h>
  4828.  
  4829.          int ginwindow(gwptr,x,y);
  4830.          GWDW *gwptr;                 graphic window pointer
  4831.          short x,y;                   (x,y) coordinate to check
  4832.  
  4833.  
  4834.          DESCRIPTION
  4835.  
  4836.          The function ginwindow() determines whether a point lies inside
  4837.          the specified graphic window or not.  For a meaningful check,
  4838.          the point described by (x,y) must be a physical one, not a
  4839.          logical one.
  4840.  
  4841.  
  4842.          RETURN VALUE
  4843.  
  4844.          This function returns a 1 if the point lies inside the window, a
  4845.          0 if the point is outside the window.
  4846.  
  4847.  
  4848.          EXAMPLE
  4849.  
  4850.          This example creates a button which may be "pushed."  Simply
  4851.          move the cursor into the "push" button, click the left mouse
  4852.          button, and watch for a 3-D effect.
  4853.  
  4854.  
  4855.          #include <stdio.h>
  4856.          #include <graph.h>
  4857.  
  4858.          #include "gplus.h"
  4859.          #include "gscreen.h"
  4860.          #include "mouser.h"
  4861.  
  4862.          main()
  4863.          {
  4864.              int quit, ch, device;
  4865.              struct ms_status ms_status;
  4866.              GWDW *groot;
  4867.              GWDW *gwpush;
  4868.              GWDW *gwquit;
  4869.  
  4870.              mpsetvideomode(_ERESCOLOR);
  4871.  
  4872.              if(ms_reset() == 0)
  4873.              {
  4874.                  printf("\nMouse driver not loaded.\n");
  4875.                  exit(1);
  4876.              }
  4877.              ms_setevent(1);
  4878.              ms_showcursor();
  4879.  
  4880.  
  4881.          Copyright 1989, 1990 by Michael Yam                   Mouser 7-7
  4882.  
  4883.  
  4884.  
  4885.  
  4886.  
  4887.          MPLUS                                                  ginwindow
  4888.  
  4889.  
  4890.  
  4891.              groot = groottopen(10, 20, 16, 50, _GFILLINTERIOR,
  4892.                                 BRIGHTWHITE, GREY);
  4893.              _settextposition(5, 1);
  4894.              mpouttext("Click left mouse button", BRIGHTWHITE, -1);
  4895.  
  4896.              gwpush = gwdwtopen(11, 25, 13, 32, _GRAISE, BLACK, WHITE);
  4897.              mpouttext(" PUSH", BLACK, -1);
  4898.  
  4899.              gwquit = gwdwtopen(11, 40, 13, 47, _GRAISE, BLACK, WHITE);
  4900.              mpouttext(" QUIT", BLACK, -1);
  4901.  
  4902.              quit = 0;
  4903.              while(!quit)
  4904.              {
  4905.                  device = dev_ready(&ch, &ms_status);
  4906.                  if(device == _MS)
  4907.                  {
  4908.                      if ((ms_status.condmask & _LBPRESSED) ||
  4909.                          (ms_status.condmask & _LBRELEASED))
  4910.                      {
  4911.                          if (ginwindow(gwpush, ms_status.x, ms_status.y))
  4912.                              physhighlite(gwpush->x1, gwpush->y1,
  4913.                                           gwpush->x2, gwpush->y2);
  4914.                          else if(ginwindow(gwquit, ms_status.x,
  4915.                                                    ms_status.y))
  4916.                          {
  4917.                              physhighlite(gwquit->x1, gwquit->y1,
  4918.                                           gwquit->x2, gwquit->y2);
  4919.                              quit = 1;
  4920.                          }
  4921.                      }
  4922.                  }
  4923.              }
  4924.              ms_reset();
  4925.              gwdwclose(gwpush);
  4926.              gwdwclose(gwquit);
  4927.              grootclose(groot);
  4928.              mpsetvideomode(_DEFAULTMODE);
  4929.          }
  4930.  
  4931.  
  4932.  
  4933.  
  4934.  
  4935.  
  4936.  
  4937.  
  4938.  
  4939.  
  4940.  
  4941.  
  4942.  
  4943.  
  4944.  
  4945.  
  4946.  
  4947.          Copyright 1989, 1990 by Michael Yam                   Mouser 7-8
  4948.  
  4949.  
  4950.  
  4951.  
  4952.  
  4953.          MPLUS                                                  ms_cursor
  4954.  
  4955.  
  4956.          SUMMARY
  4957.  
  4958.          #include <mouser.h>
  4959.  
  4960.          int ms_cursor(void);
  4961.  
  4962.  
  4963.          DESCRIPTION
  4964.  
  4965.          The function ms_cursor() returns the status of the mouse cursor.
  4966.  
  4967.  
  4968.          RETURN VALUE
  4969.  
  4970.          This function returns a 1 if the cursor was on, a 0 if the
  4971.          cursor was off.
  4972.  
  4973.  
  4974.          EXAMPLE
  4975.  
  4976.          #include <graph.h>
  4977.          #include <mouser.h>
  4978.  
  4979.          main()
  4980.          {
  4981.              _clearscreen( _GCLEARSCREEN );
  4982.  
  4983.              if( ms_reset() == 0 )
  4984.              {
  4985.                  printf("\nMouse driver not loaded.\n");
  4986.                  exit(1);
  4987.              }
  4988.  
  4989.              if( ms_cursor() == 0 )
  4990.              {
  4991.                  printf("\nCursor is off.\n");
  4992.                  printf("Press a key to turn it on.\n");
  4993.                  getch();
  4994.                  ms_showcursor();
  4995.              }
  4996.  
  4997.              if( ms_cursor() == 1 )
  4998.              {
  4999.                  printf("\nCursor is on.\n");
  5000.                  printf("Press a key to turn it off.\n");
  5001.                  getch();
  5002.                  ms_hidecursor();
  5003.              }
  5004.          }
  5005.  
  5006.  
  5007.  
  5008.  
  5009.  
  5010.  
  5011.  
  5012.  
  5013.          Copyright 1989, 1990 by Michael Yam                   Mouser 7-9
  5014.  
  5015.  
  5016.  
  5017.  
  5018.  
  5019.          MPLUS                                             ms_getposition
  5020.  
  5021.  
  5022.          SUMMARY
  5023.  
  5024.          #include <mouser.h>
  5025.  
  5026.          void ms_getposition(x,y,left,right)
  5027.          short *x,*y;                 physical x,y coordinate of cursor position
  5028.          int *left;                   status of the left button
  5029.          int *right;                  status of the right button;
  5030.  
  5031.  
  5032.          DESCRIPTION
  5033.  
  5034.          The ms_getposition() function gets the mouse cursor position and
  5035.          the status of its buttons.  The x,y coordinate is physical and
  5036.          will be correct for high resolution as well as medium resolution
  5037.          graphics modes.
  5038.  
  5039.          The "left" argument will be set to 0 if the left button is up,
  5040.          and 1 if the left button is down.
  5041.  
  5042.          The "right" parameter will be set to 0 if the right button is
  5043.          up, and 1 if the right button is down.
  5044.  
  5045.  
  5046.          RETURN VALUE
  5047.  
  5048.          None.
  5049.  
  5050.  
  5051.  
  5052.  
  5053.  
  5054.  
  5055.  
  5056.  
  5057.  
  5058.  
  5059.  
  5060.  
  5061.  
  5062.  
  5063.  
  5064.  
  5065.  
  5066.  
  5067.  
  5068.  
  5069.  
  5070.  
  5071.  
  5072.  
  5073.  
  5074.  
  5075.  
  5076.  
  5077.  
  5078.  
  5079.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-10
  5080.  
  5081.  
  5082.  
  5083.  
  5084.  
  5085.          MPLUS                                             ms_getposition
  5086.  
  5087.  
  5088.          EXAMPLE
  5089.  
  5090.          #include <graph.h>
  5091.          #include <mouser.h>
  5092.          #include <gplus.h>
  5093.  
  5094.          main()
  5095.          {
  5096.              short x, y;
  5097.              int left, right;
  5098.  
  5099.              mpsetvideomode ( _ERESCOLOR );
  5100.  
  5101.              if( ms_reset() == 0 )
  5102.              {
  5103.                  printf("\nMouse driver not loaded.\n");
  5104.                  exit(1);
  5105.              }
  5106.  
  5107.              ms_showcursor();
  5108.              ms_getposition( &x, &y, &left, &right );
  5109.              printf("\nCursor is at %d, %d\n", x, y );
  5110.              printf("Press a key...");
  5111.              getch();
  5112.  
  5113.              ms_setposition( 0, 0 );
  5114.              ms_getposition( &x, &y, &left, &right );
  5115.              printf("\nCursor is at %d, %d\n", x, y );
  5116.              printf("Press a key...");
  5117.              getch();
  5118.  
  5119.              ms_reset();
  5120.              mpsetvideomode( _DEFAULTMODE );
  5121.              return 0;
  5122.          }
  5123.  
  5124.  
  5125.  
  5126.  
  5127.  
  5128.  
  5129.  
  5130.  
  5131.  
  5132.  
  5133.  
  5134.  
  5135.  
  5136.  
  5137.  
  5138.  
  5139.  
  5140.  
  5141.  
  5142.  
  5143.  
  5144.  
  5145.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-11
  5146.  
  5147.  
  5148.  
  5149.  
  5150.  
  5151.          MPLUS                                                ms_getpress
  5152.  
  5153.  
  5154.          SUMMARY
  5155.  
  5156.          #include <mouser.h>
  5157.  
  5158.          int ms_getpress(button,bstatus,bpress,x,y);
  5159.          int button;                  button to check (left or right)
  5160.          int *bstatus;                status of the button
  5161.          int *bpress;                 number of times button was pressed
  5162.                                       since last call
  5163.          short *x,*y;                 cursor position, physical
  5164.                                       coordinate
  5165.  
  5166.  
  5167.          DESCRIPTION
  5168.  
  5169.          The function ms_getpress() retrieves the status of the specified
  5170.          button, the number of times it was pressed since this function
  5171.          was called, and position of the cursor at the last time the
  5172.          specified button was pressed.
  5173.  
  5174.          Two constants are defined in mouser.h to specify the button to
  5175.          test:
  5176.  
  5177.              Constant                 Meaning
  5178.              -------------------------------------
  5179.              MSLBTN                   left button
  5180.              MSRBTN                   right button
  5181.  
  5182.          The status returned will be 0 if the button was up, and 1 if the
  5183.          button was down.  The number of button presses can range from 0
  5184.          to 32767.  Overflow is not detected.  After the call, the value
  5185.          is set to 0.  The x,y coordinate corresponds to the cursor's
  5186.          position at the time the button was last pressed; it does not
  5187.          necessarily correspond to the cursor's current position.
  5188.  
  5189.  
  5190.          RETURN VALUE
  5191.  
  5192.          This function returns and integer containing the number of times
  5193.          the specified button was pressed since the last call.
  5194.  
  5195.  
  5196.  
  5197.  
  5198.  
  5199.  
  5200.  
  5201.  
  5202.  
  5203.  
  5204.  
  5205.  
  5206.  
  5207.  
  5208.  
  5209.  
  5210.  
  5211.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-12
  5212.  
  5213.  
  5214.  
  5215.  
  5216.  
  5217.          MPLUS                                                ms_getpress
  5218.  
  5219.  
  5220.          EXAMPLE
  5221.  
  5222.          #include <graph.h>
  5223.          #include <mouser.h>
  5224.          #include <gplus.h>
  5225.  
  5226.          main()
  5227.          {
  5228.              int bstatus;
  5229.              int bpress;
  5230.              int brelease;
  5231.              short x,y;
  5232.  
  5233.              mpsetvideomode( _ERESCOLOR );
  5234.  
  5235.              if( ms_reset() == 0 )
  5236.              {
  5237.                  printf("\nMouse driver not loaded.\n");
  5238.                  exit(1);
  5239.              }
  5240.              ms_showcursor();
  5241.  
  5242.              printf("\nPress the left mouse button a few times.\n");
  5243.              printf("\nPress a keyboard key when done...\n");
  5244.              getch();
  5245.  
  5246.              ms_getpress( MSLBTN, &bstatus, &bpress, &x, &y );
  5247.              ms_getrelease( MSLBTN, &bstatus, &brelease, &x, &y );
  5248.  
  5249.              printf("Left button was pressed %d times.\n", bpress );
  5250.              printf("Left button was released %d times.\n", brelease );
  5251.  
  5252.              printf("\nPress a key...");
  5253.              getch();
  5254.  
  5255.              ms_reset();
  5256.              mpsetvideomode( _DEFAULTMODE );
  5257.              return 0;
  5258.          }
  5259.  
  5260.  
  5261.  
  5262.  
  5263.  
  5264.  
  5265.  
  5266.  
  5267.  
  5268.  
  5269.  
  5270.  
  5271.  
  5272.  
  5273.  
  5274.  
  5275.  
  5276.  
  5277.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-13
  5278.  
  5279.  
  5280.  
  5281.  
  5282.  
  5283.          MPLUS                                              ms_getrelease
  5284.  
  5285.  
  5286.          SUMMARY
  5287.  
  5288.          #include <mouser.h>
  5289.  
  5290.          int ms_getrelease(button,bstatus,brelease,x,y);
  5291.          int button;                  button to check (left or right)
  5292.          int *bstatus;                status of the button
  5293.          int *brelease;               number of times button was released
  5294.                                       since last call
  5295.          short *x,*y;                 cursor position
  5296.  
  5297.  
  5298.          DESCRIPTION
  5299.  
  5300.          The function ms_getrelease() retrieves the status of the
  5301.          specified button, the number of times it was released since this
  5302.          function was called, and the position of the cursor at the last
  5303.          time the specified button was released.
  5304.  
  5305.          Two constants are defined in mouser.h to specify the button to
  5306.          test:
  5307.  
  5308.              Constant                 Meaning
  5309.              -------------------------------------
  5310.              MSLBTN                   left button
  5311.              MSRBTN                   right button
  5312.  
  5313.          The status returned will be 0 if the button was up, and 1 if the
  5314.          button was down.  The number of button releases can range from 0
  5315.          to 32767.  Overflow is not detected.  After the call, the value
  5316.          is set to 0.  The x,y coordinate corresponds to the cursor's
  5317.          position at the time the button was last released; it does not
  5318.          necessarily correspond to the cursor's current position.
  5319.  
  5320.  
  5321.          RETURN VALUE
  5322.  
  5323.          This function returns and integer containing the number of times
  5324.          the specified button was released since the last call.
  5325.  
  5326.  
  5327.          EXAMPLE
  5328.  
  5329.          See ms_getpress().
  5330.  
  5331.  
  5332.  
  5333.  
  5334.  
  5335.  
  5336.  
  5337.  
  5338.  
  5339.  
  5340.  
  5341.  
  5342.  
  5343.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-14
  5344.  
  5345.  
  5346.  
  5347.  
  5348.  
  5349.          MPLUS                                              ms_hidecursor
  5350.  
  5351.  
  5352.          SUMMARY
  5353.  
  5354.          #include <mouser.h>
  5355.  
  5356.          void ms_hidecursor(void);
  5357.  
  5358.  
  5359.          DESCRIPTION
  5360.  
  5361.          The ms_hidecursor() function hides the mouse cursor.  Although
  5362.          it cannot be seen on the screen, the cursor still tracks any
  5363.          mouse motion.
  5364.  
  5365.          The cursor should be hidden any time the screen is read from or
  5366.          written to.
  5367.  
  5368.  
  5369.          RETURN VALUE
  5370.  
  5371.          None.
  5372.  
  5373.  
  5374.          EXAMPLE
  5375.  
  5376.          See ms_cursor().
  5377.  
  5378.  
  5379.  
  5380.  
  5381.  
  5382.  
  5383.  
  5384.  
  5385.  
  5386.  
  5387.  
  5388.  
  5389.  
  5390.  
  5391.  
  5392.  
  5393.  
  5394.  
  5395.  
  5396.  
  5397.  
  5398.  
  5399.  
  5400.  
  5401.  
  5402.  
  5403.  
  5404.  
  5405.  
  5406.  
  5407.  
  5408.  
  5409.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-15
  5410.  
  5411.  
  5412.  
  5413.  
  5414.  
  5415.          MPLUS                                                    ms_poll
  5416.  
  5417.  
  5418.          SUMMARY
  5419.  
  5420.          #include <mouser.h>
  5421.  
  5422.          int ms_poll(ms_status);
  5423.          struct ms_status *ms_status;
  5424.  
  5425.  
  5426.          DESCRIPTION
  5427.  
  5428.          The ms_poll() function polls the status of the mouse and stores
  5429.          it in the structure "ms_status." Since this function polls the
  5430.          mouse, "condmask" will be incorrect.  "condmask" is valid only
  5431.          for dev_ready().
  5432.  
  5433.          This function may be used in place of dev_ready() when a program
  5434.          receives input solely from a mouse (and not from the keyboard).
  5435.  
  5436.  
  5437.          RETURN VALUE
  5438.  
  5439.          The function returns the constant _MS.
  5440.  
  5441.  
  5442.          EXAMPLE
  5443.  
  5444.          #include <graph.h>
  5445.          #include <gplus.h>
  5446.          #include <mouser.h>
  5447.  
  5448.          main()
  5449.          {
  5450.              struct ms_status ms_status;
  5451.  
  5452.              mpsetvideomode( _ERESCOLOR );
  5453.  
  5454.              if( ms_reset() == 0 )
  5455.              {
  5456.                  printf("\nMouse driver not loaded.\n");
  5457.                  exit(1);
  5458.              }
  5459.              printf("Press right button to quit...");
  5460.  
  5461.              ms_showcursor();
  5462.              while(1)
  5463.              {
  5464.                  ms_poll( &ms_status );
  5465.                  if( ms_status.rbtn )
  5466.                      break;
  5467.              }
  5468.              ms_reset();
  5469.              mpsetvideomode( _DEFAULTMODE );
  5470.              return 0;
  5471.          }
  5472.  
  5473.  
  5474.  
  5475.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-16
  5476.  
  5477.  
  5478.  
  5479.  
  5480.  
  5481.          MPLUS                                                   ms_ready
  5482.  
  5483.  
  5484.          SUMMARY
  5485.  
  5486.          #include <mouser.h>
  5487.  
  5488.          unsigned int ms_ready(void);
  5489.  
  5490.  
  5491.          DESCRIPTION
  5492.  
  5493.          The ms_ready() function determines whether there is mouse input
  5494.          waiting or not.  Mouse event checking must be enabled with:
  5495.  
  5496.              ms_setevent(1);
  5497.  
  5498.          When the mouse is moved or any of its buttons pressed or
  5499.          released, an interrupt is generated.
  5500.  
  5501.  
  5502.          RETURN VALUE
  5503.  
  5504.          This function returns a 0 if no mouse activity was detected.  If
  5505.          there was any activity, a bit mask is returned.  Manifest
  5506.          constants for these masks are defined in mouser.h and described
  5507.          table 7-1 at the beginning of this chapter.
  5508.  
  5509.  
  5510.  
  5511.  
  5512.  
  5513.  
  5514.  
  5515.  
  5516.  
  5517.  
  5518.  
  5519.  
  5520.  
  5521.  
  5522.  
  5523.  
  5524.  
  5525.  
  5526.  
  5527.  
  5528.  
  5529.  
  5530.  
  5531.  
  5532.  
  5533.  
  5534.  
  5535.  
  5536.  
  5537.  
  5538.  
  5539.  
  5540.  
  5541.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-17
  5542.  
  5543.  
  5544.  
  5545.  
  5546.  
  5547.          MPLUS                                                   ms_ready
  5548.  
  5549.  
  5550.          EXAMPLE
  5551.  
  5552.          #include <graph.h>
  5553.          #include <gplus.h>
  5554.          #include <mouser.h>
  5555.  
  5556.          main()
  5557.          {
  5558.              int ch;
  5559.              struct ms_status ms_status;
  5560.              unsigned int mask;
  5561.  
  5562.              if( ms_reset() == 0 )
  5563.              {
  5564.                  printf("\nMouse driver not loaded.\n");
  5565.                  exit(1);
  5566.              }
  5567.              mpsetvideomode( _DEFAULTMODE );
  5568.  
  5569.              ms_setevent(1);
  5570.              printf("\nMove the mouse or press its buttons...\n");
  5571.              while( !(mask=ms_ready()) );
  5572.              printf("\nMask = %u\n", mask );
  5573.  
  5574.              ms_setevent(0);
  5575.              printf("\nMouse response should be dead now.\n");
  5576.              printf("\nTry the mouse.  Press a keyboard key to quit...\n");
  5577.              while( !dev_ready( &ch, &ms_status ) );
  5578.  
  5579.              ms_reset();
  5580.          }
  5581.  
  5582.  
  5583.  
  5584.  
  5585.  
  5586.  
  5587.  
  5588.  
  5589.  
  5590.  
  5591.  
  5592.  
  5593.  
  5594.  
  5595.  
  5596.  
  5597.  
  5598.  
  5599.  
  5600.  
  5601.  
  5602.  
  5603.  
  5604.  
  5605.  
  5606.  
  5607.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-18
  5608.  
  5609.  
  5610.  
  5611.  
  5612.  
  5613.          MPLUS                                                   ms_reset
  5614.  
  5615.  
  5616.          SUMMARY
  5617.  
  5618.          #include <mouser.h>
  5619.  
  5620.          int ms_reset(void);
  5621.  
  5622.  
  5623.          DESCRIPTION
  5624.  
  5625.          The function ms_reset() resets the mouse driver as follows:
  5626.  
  5627.              -- cursor is positioned to screen's center
  5628.              -- the cursor is hidden
  5629.              -- MPLUS' internal cursor flag is set to 0 (0 = off, 1 = on)
  5630.              -- interrupt call mask is 0 (no interrupt subroutine
  5631.                 specified)
  5632.              -- MPLUS' mouse event checking is disabled
  5633.                 ( ms_setevent(0) )
  5634.              -- light pen emulation enabled
  5635.              -- horizontal mickey/pixel ratio:  8 to 8
  5636.              -- vertical mickey/pixel ratio: 16 to 8
  5637.              -- boundary for cursor is set to the screen's physical
  5638.                 coordinates
  5639.              -- CRT page number is 0
  5640.  
  5641.  
  5642.          When programming the mouse, this function should be called at
  5643.          the start of your program and at the end of your program.
  5644.  
  5645.  
  5646.          RETURN VALUE
  5647.  
  5648.          This function returns a 0 if there is no mouse hardware or
  5649.          software installed.  If a mouse is properly installed, the
  5650.          number of buttons on the mouse is returned.
  5651.  
  5652.  
  5653.          EXAMPLE
  5654.  
  5655.          #include <mouser.h>
  5656.  
  5657.          main()
  5658.          {
  5659.              int ret;
  5660.  
  5661.              ret = ms_reset();
  5662.  
  5663.              if( ret == 0 )
  5664.                  printf("\nMouse driver not loaded.");
  5665.              else
  5666.                  printf("\nMouse has %d buttons.", ret );
  5667.          }
  5668.  
  5669.  
  5670.  
  5671.  
  5672.  
  5673.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-19
  5674.  
  5675.  
  5676.  
  5677.  
  5678.  
  5679.          MPLUS                                                ms_setevent
  5680.  
  5681.  
  5682.          SUMMARY
  5683.  
  5684.          #include <mouser.h>
  5685.  
  5686.          void ms_setevent(flag);
  5687.  
  5688.  
  5689.          DESCRIPTION
  5690.  
  5691.          The ms_setevent() function enables or disables mouse event
  5692.          checking.  Setting "flag" to 1 enables an interrupt routine
  5693.          which allows the functions dev_ready() and ms_ready() to
  5694.          operate.
  5695.  
  5696.          Setting "flag" to zero diables mouse event checking in which
  5697.          case the mouse will never appear ready to dev_ready() and
  5698.          ms_ready().
  5699.  
  5700.          Be sure to disable checking when leaving your program.  This may
  5701.          be accomplished with either ms_setevent(0) or ms_reset().
  5702.  
  5703.  
  5704.          RETURN VALUE
  5705.  
  5706.          None.
  5707.  
  5708.  
  5709.          EXAMPLE
  5710.  
  5711.          See ms_ready().
  5712.  
  5713.  
  5714.  
  5715.  
  5716.  
  5717.  
  5718.  
  5719.  
  5720.  
  5721.  
  5722.  
  5723.  
  5724.  
  5725.  
  5726.  
  5727.  
  5728.  
  5729.  
  5730.  
  5731.  
  5732.  
  5733.  
  5734.  
  5735.  
  5736.  
  5737.  
  5738.  
  5739.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-20
  5740.  
  5741.  
  5742.  
  5743.  
  5744.  
  5745.          MPLUS                                             ms_setposition
  5746.  
  5747.  
  5748.          SUMMARY
  5749.  
  5750.          #include <mouser.h>
  5751.  
  5752.          void ms_setposition(x,y);
  5753.          short x,y;                   screen location to place the cursor
  5754.  
  5755.  
  5756.          DESCRIPTION
  5757.  
  5758.          The function ms_setposition() positions the cursor to the
  5759.          physical coordinate x,y.
  5760.  
  5761.  
  5762.          RETURN VALUE
  5763.  
  5764.          None.
  5765.  
  5766.  
  5767.          EXAMPLE
  5768.  
  5769.          See ms_getposition().
  5770.  
  5771.  
  5772.  
  5773.  
  5774.  
  5775.  
  5776.  
  5777.  
  5778.  
  5779.  
  5780.  
  5781.  
  5782.  
  5783.  
  5784.  
  5785.  
  5786.  
  5787.  
  5788.  
  5789.  
  5790.  
  5791.  
  5792.  
  5793.  
  5794.  
  5795.  
  5796.  
  5797.  
  5798.  
  5799.  
  5800.  
  5801.  
  5802.  
  5803.  
  5804.  
  5805.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-21
  5806.  
  5807.  
  5808.  
  5809.  
  5810.  
  5811.          MPLUS                                              ms_showcursor
  5812.  
  5813.  
  5814.          SUMMARY
  5815.  
  5816.          #include <mouser.h>
  5817.  
  5818.          void ms_showcursor(void);
  5819.  
  5820.  
  5821.          DESCRIPTION
  5822.  
  5823.          The function ms_showcursor() displays the mouse cursor on the
  5824.          screen.
  5825.  
  5826.  
  5827.          RETURN VALUE
  5828.  
  5829.          None.
  5830.  
  5831.  
  5832.          EXAMPLE
  5833.  
  5834.          See ms_cursor().
  5835.  
  5836.  
  5837.  
  5838.  
  5839.  
  5840.  
  5841.  
  5842.  
  5843.  
  5844.  
  5845.  
  5846.  
  5847.  
  5848.  
  5849.  
  5850.  
  5851.  
  5852.  
  5853.  
  5854.  
  5855.  
  5856.  
  5857.  
  5858.  
  5859.  
  5860.  
  5861.  
  5862.  
  5863.  
  5864.  
  5865.  
  5866.  
  5867.  
  5868.  
  5869.  
  5870.  
  5871.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-22
  5872.  
  5873.  
  5874.  
  5875.  
  5876.  
  5877.          MPLUS                                                  ms_window
  5878.  
  5879.  
  5880.          SUMMARY
  5881.  
  5882.          #include <mouser.h>
  5883.  
  5884.          void ms_window(x1,y1,x2,y2);
  5885.          short x1,y1;                 upper left corner
  5886.          short x2,y2;                 lower right corner
  5887.  
  5888.          DESCRIPTION
  5889.  
  5890.          The ms_window() function retricts the motion of the mouse to a
  5891.          window on a screen bounded by the rectangle "x1,y1,x2,y2."  The
  5892.          coordinates are physical ones.
  5893.  
  5894.  
  5895.          RETURN VALUE
  5896.  
  5897.          None.
  5898.  
  5899.  
  5900.          EXAMPLE
  5901.  
  5902.          #include <graph.h>
  5903.          #include <mouser.h>
  5904.          #include <gplus.h>
  5905.  
  5906.          main()
  5907.          {
  5908.              mpsetvideomode( _ERESCOLOR );
  5909.  
  5910.              if( ms_reset() == 0 )
  5911.              {
  5912.                  printf("\nMouse driver not loaded.\n");
  5913.                  exit(1);
  5914.              }
  5915.              ms_showcursor();
  5916.  
  5917.              _rectangle( _GBORDER, 100, 50, 400, 200 );
  5918.              ms_window( 100, 50, 400, 200 );
  5919.  
  5920.              _settextposition( 22, 1 );
  5921.              _outtext("Mouse motion is restricted to rectangle.\n");
  5922.              _outtext("Press a key to quit...");
  5923.              getch();
  5924.  
  5925.              ms_reset();
  5926.              mpsetvideomode( _DEFAULTMODE );
  5927.          }
  5928.  
  5929.  
  5930.  
  5931.  
  5932.  
  5933.  
  5934.  
  5935.  
  5936.  
  5937.          Copyright 1989, 1990 by Michael Yam                  Mouser 7-23
  5938.  
  5939.  
  5940.  
  5941.  
  5942.  
  5943.        MPLUS                                             FUNCTION INDEX
  5944.  
  5945.  
  5946.  
  5947.  
  5948.  
  5949.  
  5950.  
  5951.        APPENDIX A
  5952.        ----------
  5953.  
  5954.  
  5955.        FUNCTION INDEX
  5956.  
  5957.  
  5958.  
  5959.  
  5960.  
  5961.             dev_ready()      7-3              mb_close()          6-4
  5962.             gdclose()        4-3              mb_open()           6-5
  5963.             gdialog()        4-4              mb_run()            6-7
  5964.             gdprompt()       4-6              mb_stdcolors()      6-8
  5965.             gdwrite()        4-7              mpgetimage()        5-8
  5966.             ginrectangle()   7-5              mpouttext()         2-3
  5967.             ginwindow()      7-7              mpputimage()        5-10
  5968.             gpickup()        5-3              mpsetvideomode()    2-5
  5969.             gputdown()       5-5              mpwordwrap()        2-7
  5970.             grootclose()     3-4              ms_cursor()         7-9
  5971.             grootopen()      3-5              ms_getposition()    7-10
  5972.             groottopen()     3-6              ms_getpress()       7-12
  5973.             gwdwclose()      3-7              ms_getrelease()     7-14
  5974.             gwdwclr()        3-8              ms_hidecursor()     7-15
  5975.             gwdwgetactv()    3-9              ms_poll()           7-16
  5976.             gwdwgetorg()     3-10             ms_ready()          7-17
  5977.             gwdwopen()       3-12             ms_reset()          7-19
  5978.             gwdwsetactv()    3-13             ms_setevent()       7-20
  5979.             gwdwsetorg()     3-14             ms_setposition()    7-21
  5980.             gwdwtopen()      3-15             ms_showcursor()     7-22
  5981.             loghighlite()    5-6              ms_window()         7-23
  5982.                                               physhighlite()      5-11
  5983.                                               xorline()           5-12
  5984.                                               xorpt()             5-14
  5985.  
  5986.  
  5987.  
  5988.  
  5989.  
  5990.  
  5991.  
  5992.  
  5993.  
  5994.  
  5995.  
  5996.  
  5997.  
  5998.  
  5999.  
  6000.  
  6001.  
  6002.  
  6003.          Copyright 1989, 1990 by Michael Yam          Function Index  A-1
  6004.  
  6005.  
  6006.  
  6007.  
  6008.  
  6009.          MPLUS                                           REVISION HISTORY
  6010.  
  6011.  
  6012.  
  6013.  
  6014.  
  6015.  
  6016.  
  6017.          APPENDIX B
  6018.          ----------
  6019.  
  6020.  
  6021.          REVISION HISTORY
  6022.  
  6023.          Version 1.3  September 1, 1990
  6024.          ------------------------------
  6025.          1)  Function name changes:
  6026.  
  6027.                   Old            New
  6028.                   -----------------------------
  6029.                   outtext()      mpouttext()
  6030.                   setvideomode() mpsetvideomode()
  6031.                   getimage()     mpgetimage()
  6032.                   putimage()     mpputimage()
  6033.  
  6034.  
  6035.              The "mp" prefix was added to avoid possible naming
  6036.              collisions when using MPLUS with other libraries.  Code
  6037.              using the old names will still compile because of the macros
  6038.              in "gplus.h", but use the new names to ensure future
  6039.              compatibility with MPLUS.
  6040.  
  6041.          2)  New function: mpwordwrap().  This enables or disables word
  6042.              wrap when using mpouttext().
  6043.  
  6044.          3)  Revamped menu system.  Now supports "greyout" and up to 5
  6045.              levels of submenus.  See Chapter 6 for details.
  6046.  
  6047.          4)  Text scrolling now supported for graphic windows opened with
  6048.              gwdwopen() and grootopen().
  6049.  
  6050.  
  6051.          Version 1.2  May 1, 1990
  6052.          ------------------------
  6053.          1)  Two new graphic window types were added to simulate depth:
  6054.  
  6055.                   _GRAISE - a raised graphic window.
  6056.                   _GSINK - a sunken graphic window.
  6057.  
  6058.              These constants are defined in GPLUS.H.
  6059.  
  6060.          2)  The prompt regions in the dialogue boxes were a wee bit
  6061.              small for the mouse to easily "home" in.  They have been
  6062.              padded out with spaces to enlarge them.
  6063.  
  6064.          3)  Dialogue boxes now recognize the "Enter" and "Esc" keys.
  6065.  
  6066.  
  6067.  
  6068.  
  6069.          Copyright 1989, 1990 by Michael Yam        Revision History  B-1
  6070.  
  6071.  
  6072.  
  6073.  
  6074.  
  6075.          MPLUS                                           REVISION HISTORY
  6076.  
  6077.  
  6078.          4)  A new bar menu function was added: bm_exit().  This gives
  6079.              the user a "hot" key to exit the bar menu.
  6080.  
  6081.          5)  The option to purchase source code is now available.
  6082.  
  6083.  
  6084.          Version 1.1  January 1, 1990
  6085.          ----------------------------
  6086.          1)  Improved the use of memory when opening graphic windows.  In
  6087.              version 1.0 the memory may have been actually available but
  6088.              unusable due to fragmentation.  Version 1.1 is "smart"
  6089.              enough to use that fragmented memory; now more and larger
  6090.              graphic windows may be opened at a time.
  6091.  
  6092.          2)  A cosmetic change was made to the bar menu function
  6093.              bm_show().  The titles in the bar used to be centered in
  6094.              logical fields, but when titles which varied greatly in
  6095.              length were displayed, the menu appeared off-balanced.  Bar
  6096.              menu titles are now left justified and separated by 4
  6097.              spaces.
  6098.  
  6099.          3)  The demo program MPDEMO.EXE was introduced.
  6100.  
  6101.  
  6102.          Version 1.0  September 1, 1989
  6103.          ------------------------------
  6104.          MPLUS is born.
  6105.  
  6106.  
  6107.  
  6108.  
  6109.  
  6110.  
  6111.  
  6112.  
  6113.  
  6114.  
  6115.  
  6116.  
  6117.  
  6118.  
  6119.  
  6120.  
  6121.  
  6122.  
  6123.  
  6124.  
  6125.  
  6126.  
  6127.  
  6128.  
  6129.  
  6130.  
  6131.  
  6132.  
  6133.  
  6134.  
  6135.          Copyright 1989, 1990 by Michael Yam        Revision History  B-2
  6136.  
  6137.  
  6138.  
  6139.  
  6140.  
  6141.          MPLUS                                  LIBRARY INCOMPATIBILITIES
  6142.  
  6143.  
  6144.  
  6145.  
  6146.  
  6147.  
  6148.  
  6149.          APPENDIX C
  6150.          ----------
  6151.  
  6152.  
  6153.          LIBRARY INCOMPATIBILITIES
  6154.  
  6155.          Certain calls to Microsoft's GRAPHICS library can confuse MPLUS.
  6156.          The side effects of using Microsoft's _outtext() and
  6157.          _setvideomode() functions have already been discussed in Chapter
  6158.          2, "Graphic Support."  Presented here are other Microsoft
  6159.          functions you should use carefully, if at all.
  6160.  
  6161.  
  6162.          _getimage(), _putimage()
  6163.          ------------------------
  6164.  
  6165.          These functions do not recognize the presence of a mouse.  A
  6166.          visible cursor will interfere with the "putting" and "getting"
  6167.          of the screen image.
  6168.  
  6169.          If your application uses a mouse, then MPLUS' mpputimage() and
  6170.          mpgetimage() is recommended.
  6171.  
  6172.  
  6173.          _remapallpalette(), _remappalette(), _setbkcolor()
  6174.          --------------------------------------------------
  6175.  
  6176.          The #defines in GSCREEN.H are not universal and are valid only
  6177.          for the default palette and background.  Remapping the palette
  6178.          or setting the background color will render the #defines
  6179.          incorrect.  Consequently, you will need to write your own
  6180.          #defines which map to your new colors.
  6181.  
  6182.          These Microsoft functions will also alter the colors used by the
  6183.          dialogue boxes.  For now, the only way to preserve the colors is
  6184.          to avoid remapping BLUE, WHITE, BRIGHTWHITE, BLACK, RED, and
  6185.          YELLOW.
  6186.  
  6187.          If you simply desire a new background color instead of an
  6188.          entirely new palette, see grootopen() or use the code fragment
  6189.          below:
  6190.  
  6191.              _setcolor( background );
  6192.              _rectangle( _GFILLINTERIOR, 0, 0,
  6193.                          _videoconfig.numxpixels-1,
  6194.                          _videoconfig.numypixels-1 );
  6195.  
  6196.  
  6197.          This paints the entire screen with the color of your choice.
  6198.  
  6199.  
  6200.  
  6201.          Copyright 1989, 1990 by Michael Yam Library Incompatibilities  C-1
  6202.  
  6203.  
  6204.  
  6205.  
  6206.  
  6207.          MPLUS                                  LIBRARY INCOMPATIBILITIES
  6208.  
  6209.  
  6210.          _settextwindow(), _setviewport()
  6211.          --------------------------------
  6212.  
  6213.          These functions generally shouldn't be needed since MPLUS
  6214.          provides graphic windows (see gwdwopen() in Chapter 3).  If you
  6215.          open a graphic window and then call _setviewport() or
  6216.          _settextwindow(), you will lose the graphic window because
  6217.          you've altered the output region.
  6218.  
  6219.          The graphic window may be recovered by setting it active again
  6220.          with:
  6221.  
  6222.              gwdwsetactv( gwptr );
  6223.  
  6224.  
  6225.  
  6226.  
  6227.  
  6228.  
  6229.  
  6230.  
  6231.  
  6232.  
  6233.  
  6234.  
  6235.  
  6236.  
  6237.  
  6238.  
  6239.  
  6240.  
  6241.  
  6242.  
  6243.  
  6244.  
  6245.  
  6246.  
  6247.  
  6248.  
  6249.  
  6250.  
  6251.  
  6252.  
  6253.  
  6254.  
  6255.  
  6256.  
  6257.  
  6258.  
  6259.  
  6260.  
  6261.  
  6262.  
  6263.  
  6264.  
  6265.  
  6266.  
  6267.          Copyright 1989, 1990 by Michael Yam Library Incompatibilities  C-2
  6268.  
  6269.  
  6270.  
  6271.  
  6272.  
  6273.          MPLUS                                          ABOUT SOURCE CODE
  6274.  
  6275.  
  6276.  
  6277.  
  6278.  
  6279.  
  6280.  
  6281.          APPENDIX D
  6282.          ----------
  6283.  
  6284.  
  6285.          ABOUT SOURCE CODE
  6286.  
  6287.          This section is for those interested in working with the source
  6288.          code.
  6289.  
  6290.  
  6291.          The Make Files
  6292.          --------------
  6293.  
  6294.              MPLUS.MAK                For MSC 5.x MAKE utility.
  6295.              MPLUS.NMK                For MSC 6.0 NMAKE uitlity.  Rename
  6296.                                       to "makefile" if you prefer.
  6297.  
  6298.  
  6299.          To build a model of the MPLUS Graphic Interface Library, you
  6300.          require the following:
  6301.  
  6302.              Microsoft C Compiler 5.x or 6.0.
  6303.              Microsoft Macro Assembler 4.x or Turbo Assembler 1.x.
  6304.  
  6305.  
  6306.          For simplicity, the make files provided assume that all MPLUS
  6307.          header and source files are in the current directory, and that
  6308.          all output goes to the current directory.  It also assumes you
  6309.          will be using MASM.  Customize as needed.
  6310.  
  6311.          The default library created will be the small model.  To specify
  6312.          other models, use the following:
  6313.  
  6314.              MSC 5.x
  6315.              -------
  6316.              make model=X mplus.mak
  6317.  
  6318.              MSC 6.0
  6319.              -------
  6320.              nmake model=X /f mplus.nmk
  6321.  
  6322.          where X can be S, M, C, or L.
  6323.  
  6324.          MPLUS will not run properly as a huge model library.
  6325.          Applications compiled in the huge model may be linked with the
  6326.          large model MPLUS library.
  6327.  
  6328.  
  6329.  
  6330.  
  6331.  
  6332.  
  6333.          Copyright 1989, 1990 by Michael Yam       About Source Code  D-1
  6334.  
  6335.  
  6336.  
  6337.  
  6338.  
  6339.          MPLUS                                          ABOUT SOURCE CODE
  6340.  
  6341.  
  6342.          MSC 6.0 users, please note that while NMAKE is smarter than
  6343.          MAKE, NMAKE requires more memory.  If the compiler complains
  6344.          about running out of heap space, you can use MAKE on MPLUS.MAK:
  6345.  
  6346.              make model=X compiler=MSC6 mplus.mak
  6347.  
  6348.  
  6349.          The C compile flags are the same for both MSC 5.x and 6.0:
  6350.  
  6351.              -Ox  maximum optimization.
  6352.              -Zl  don't include library-search records in object file.
  6353.  
  6354.  
  6355.          For MASM, there is only one required switch:
  6356.  
  6357.              /MX  mixed case.
  6358.  
  6359.  
  6360.          Likewise for TASM:
  6361.  
  6362.              /ml  mixed case, all symbols.
  6363.  
  6364.  
  6365.          Common Header Files
  6366.          -------------------
  6367.  
  6368.          These are the same header files distributed with the Shareware
  6369.          version of MPLUS.
  6370.  
  6371.              MPMENU.H                 for menu functions.
  6372.              GPLUS.H                  for MPLUS graphics functions.
  6373.              GSCREEN.H                contains color constants.
  6374.              MOUSER.H                 for mouse support.
  6375.  
  6376.  
  6377.          Special Header Files
  6378.          --------------------
  6379.  
  6380.          These headers are for the internal development of MPLUS.
  6381.  
  6382.              MPABORT.H                for abnormal exits.
  6383.              MPKEYS.H                 scan & ascii codes for keyboard.
  6384.              MPMEM.H                  for memory routines.
  6385.  
  6386.  
  6387.          Pre-1.3 versions also had a group of header files with names
  6388.          prefixed with an underscore.  These headers have been
  6389.          incorporated into the "common header" files and are now
  6390.          obsolete.
  6391.  
  6392.  
  6393.  
  6394.  
  6395.  
  6396.  
  6397.  
  6398.  
  6399.          Copyright 1989, 1990 by Michael Yam       About Source Code  D-2
  6400.  
  6401.  
  6402.  
  6403.  
  6404.  
  6405.          MPLUS                                          ABOUT SOURCE CODE
  6406.  
  6407.  
  6408.          C Source
  6409.          --------
  6410.  
  6411.          MPLUS 1.3 is split into 14 C modules.
  6412.  
  6413.              MPABORT.C                abort routine - resets the screen
  6414.                                       to the default, prints out the DOS
  6415.                                       errno, and calls abort().
  6416.              MPMENU.C                 Menu system.
  6417.              MPDIAL.C                 Dialogue Boxes.
  6418.              MPIMAGE.C                Graphic Images.
  6419.              MPLUS0.C                 mpsetvideomode() and related
  6420.                                       routines.
  6421.              MPLUS1.C                 mpouttext() and related routines.
  6422.              MPLUS2.C                 Other "core" graphics routines.
  6423.              MPGWDW0.C                Graphic windows.
  6424.              MPGWDW1.C                Code for the graphic root window.
  6425.              MPXORL.C                 xorline() and xorpt().
  6426.              MPMEM.C                  malloc() calls are routed here.
  6427.              MPMOUSE0.C               Mouse interrupt 33H.
  6428.              MPMOUSE1.C               Simple mouse routines.
  6429.              MPMOUSE2.C               Complex mouse routines.
  6430.  
  6431.  
  6432.          Asm Source
  6433.          ----------
  6434.  
  6435.          MPLUS 1.3 has one assembler module.
  6436.  
  6437.              MS_EVENT.ASM             Interrupt routine for mouse event
  6438.                                       handler.
  6439.  
  6440.  
  6441.          EXPANDED MEMORY SUPPORT
  6442.  
  6443.          If your application requires expanded memory support, MPMEM.C is
  6444.          the place to build it since all MPLUS malloc() calls are routed
  6445.          to this file.  If you don't have expanded memory routines yet,
  6446.          don't reinvent the wheel.  Contact Intel for a free copy of
  6447.          their EMS Toolkit:
  6448.  
  6449.              Intel Corporation
  6450.              Development Tools Operation
  6451.              5200 NE Elam Young Parkway
  6452.              Hillsboro, OR  97124
  6453.  
  6454.              1-800-538-3373
  6455.  
  6456.              Ask for "The EMS TOOLKIT for C Developers."
  6457.  
  6458.  
  6459.  
  6460.  
  6461.  
  6462.  
  6463.  
  6464.  
  6465.          Copyright 1989, 1990 by Michael Yam       About Source Code  D-3
  6466.  
  6467.  
  6468.  
  6469.  
  6470.  
  6471.          MPLUS                                                  SHAREWARE
  6472.  
  6473.  
  6474.  
  6475.  
  6476.  
  6477.  
  6478.  
  6479.          APPENDIX E
  6480.          ----------
  6481.  
  6482.  
  6483.          SHAREWARE
  6484.  
  6485.              ...is an experiment in economics and trust.
  6486.  
  6487.  
  6488.          Shareware authors, in permitting their programs to be circulated
  6489.          and readily available for you to try, can bring to market
  6490.          quality software at a modest price.  There are two advantages to
  6491.          this system:
  6492.  
  6493.              1) given various hardware and personal requirements, the
  6494.                 user gets to try the software before buying.
  6495.  
  6496.              2) the author saves the expense of advertising,
  6497.                 packaging, and distribution, and passes the savings
  6498.                 on to the user.
  6499.  
  6500.  
  6501.          Shareware should not be confused with Public Domain or free
  6502.          software.  If you continue to use a Shareware program after
  6503.          evaluating it, you should honor the registration notice and pay
  6504.          the requested fee.  What you get in return depends on the
  6505.          author, but may include a printed manual, free updates, and
  6506.          telephone support.
  6507.  
  6508.          If the experiment is successful, a symbiotic relationship
  6509.          develops between you and the author; you get quality software at
  6510.          reduced prices and the author receives compensation and
  6511.          incentive to continue work on subsequent versions of the
  6512.          program.  The experiment is considered a failure if a parasitic
  6513.          relationship develops -- a situation where registration is
  6514.          ignored and the program is used nevertheless.  Should this be
  6515.          the case, the program either dies, or moves into conventional
  6516.          commercial markets to be sold at a higher price.
  6517.  
  6518.          The decision is yours.  Please choose to make the experiment a
  6519.          successful one.
  6520.  
  6521.  
  6522.  
  6523.  
  6524.  
  6525.  
  6526.  
  6527.  
  6528.  
  6529.  
  6530.  
  6531.          Copyright 1989, 1990 by Michael Yam               Shareware  E-1
  6532.  
  6533.  
  6534.  
  6535.  
  6536.  
  6537.          MPLUS                                          OBTAINING SUPPORT
  6538.  
  6539.  
  6540.  
  6541.  
  6542.  
  6543.  
  6544.  
  6545.          APPENDIX F
  6546.          ----------
  6547.  
  6548.  
  6549.          OBTAINING SUPPORT
  6550.  
  6551.          Support is available through U.S. mail, Compuserve electronic
  6552.          mail, and voice mail.
  6553.  
  6554.          Support services are provided for registered users only.  While
  6555.          I can only help registered users with technical issues,
  6556.          inquiries about MPLUS and suggestions for its improvement are
  6557.          welcome by all.
  6558.  
  6559.          Describe the problem as thoroughly as possible and be sure to
  6560.          include the following information:
  6561.  
  6562.              1) your full name and where you may be reached.
  6563.              2) the version and memory model of MPLUS you were using.
  6564.              3) the version of DOS you were using.
  6565.              4) the contents of your autoexec.bat
  6566.              5) the contents of your config.sys
  6567.              6) your video card and the video mode your program was
  6568.                 running under when the problem occurred.
  6569.  
  6570.  
  6571.          Write to:
  6572.  
  6573.              Michael Yam
  6574.              230 East 88th St.  Apt 6B
  6575.              New York, NY  10128
  6576.  
  6577.          --- or ---
  6578.  
  6579.              Compuserve id: 76367,3040
  6580.  
  6581.          --- or ---
  6582.  
  6583.              Call (212) 996-2582, Monday thru Friday, 9am to 9pm,
  6584.              Eastern Time.
  6585.  
  6586.              Leave your message.  Response time is usually within 24
  6587.              hours.
  6588.  
  6589.  
  6590.  
  6591.  
  6592.  
  6593.  
  6594.  
  6595.  
  6596.  
  6597.          Copyright 1989, 1990 by Michael Yam       Obtaining Support  F-1
  6598.  
  6599.  
  6600.  
  6601.  
  6602.  
  6603.  
  6604.  
  6605.  
  6606.  
  6607.  
  6608.  
  6609.  
  6610.  
  6611.  
  6612.  
  6613.  
  6614.  
  6615.  
  6616.                               Last Page of MPLUS.DOC
  6617.  
  6618.  
  6619.  
  6620.  
  6621.  
  6622.  
  6623.  
  6624.  
  6625.  
  6626.  
  6627.  
  6628.  
  6629.  
  6630.  
  6631.  
  6632.  
  6633.  
  6634.  
  6635.  
  6636.  
  6637.  
  6638.  
  6639.  
  6640.  
  6641.  
  6642.  
  6643.  
  6644.  
  6645.  
  6646.  
  6647.  
  6648.  
  6649.  
  6650.  
  6651.  
  6652.  
  6653.  
  6654.  
  6655.  
  6656.  
  6657.  
  6658.  
  6659.  
  6660.  
  6661.  
  6662.  
  6663.  
  6664.  
  6665.  
  6666.  
  6667.